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

Nis*_*isd 6 javascript ecmascript-intl

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))
Run Code Online (Sandbox Code Playgroud)

谁能告诉我出了什么问题吗?

报告为 Firefox 中的错误:https://bugzilla.mozilla.org/show_bug.cgi ?id=1312388

Jef*_*den 5

正如 Andr\xc3\xa9 Bargull 在Firefox 错误报告中观察到的那样,数字排序考虑十进制数字序列,即在 Number 的 Unicode 类别中,按其数值。也就是说,当比较两个包含带小数部分的十进制数字的完全相同的字符串时,不会将整个十进制数字视为其数值 - 因为 U+002E 句号不在“数字”类别中(它“ s 而不是标点符号类别)。

\n\n

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

\n\n
["0", ".", "05"]\n["0", ".", "000005"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
[0, ".", 5]\n[0, ".", 5]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n