javascript – Intl.Collat​​or和带数字选项的自然排序使用十进制数字排序错误

使用Intl.Collat​​or对十进制数进行排序,启用数字的选项会错误地比较小数.

在某些浏览器中,比较“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都是错误的.

点赞