使用Intl.Collator对十进制数进行排序,启用数字的选项会错误地比较小数.
在某些浏览器中,比较“0.005”和“0.05”会返回“0”,因为数字是相同的.
不同浏览器的结果:
> Chrome 54 = 0
> Firefox 49 = 0
> Edge = -1
> IE 11 = -1
// Returns 0
console.log(new Intl.Collator(undefined, { numeric: true}).compare(0.000005, 0.05))
谁能告诉我什么错了?
在Firefox中报告为bug:https://bugzilla.mozilla.org/show_bug.cgi?id=1312388
最佳答案 正如AndréBargull在
the Firefox bug report中观察到的那样,数字排序仅考虑十进制数字序列,即数字的Unicode类别中的数字值.也就是说,当比较包含十进制数的两个相同的字符串和小数分量时,整数十进制数不考虑它们的数值 – 因为U 002E FULL STOP不在数字类别中(而是在标点符号类别中) ).
那么,当我们比较这两个字符串 – “0.05”和“0.000005”时 – 我们有效地比较了这些元素数组:
["0", ".", "05"]
["0", ".", "000005"]
然后当数字序列被数字值考虑时,我们进行比较
[0, ".", 5]
[0, ".", 5]
它们是相等的,因此比较它们时应该返回0. Firefox和Chrome就在这里,IE和Edge都是错误的.