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