Intl.Collat​​or 和带有数字选项的自然排序对十进制数字的排序不正确

2024-01-08

使用对十进制数进行排序Intl.Collator以及启用的选项numeric比较小数不正确。

在某些浏览器上,比较“0.005”和“0.05”会返回“0”,因为数字相同。

不同浏览器中的结果:

  • 铬 54 = 0
  • 火狐 49 = 0
  • 边缘=-1
  • IE 11 = -1
// 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 https://bugzilla.mozilla.org/show_bug.cgi?id=1312388


正如安德烈·巴古尔 (André Bargull) 在火狐错误报告 https://bugzilla.mozilla.org/show_bug.cgi?id=1312388,数字排序考虑only十进制数字序列,即在数字的 Unicode 类别中,按其数值。也就是说,当比较两个包含带小数部分的十进制数字的完全相同的字符串时,不会将整个十进制数字视为其数值 - 因为 U+002E 句号不在“数字”类别中(而是在“标点符号”中)类别)。

那么,当我们比较这两个字符串时——“0.05”和“0.000005”——我们实际上是在比较这些元素数组:

["0", ".", "05"]
["0", ".", "000005"]

然后当数字序列通过它们的数值来考虑时,我们正在比较

[0, ".", 5]
[0, ".", 5]

是相等的,所以compare比较它们时应该返回 0。 Firefox 和 Chrome 就在这里,而 IE 和 Edge 是错误的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intl.Collat​​or 和带有数字选项的自然排序对十进制数字的排序不正确 的相关文章