4

Intl.Collator使用和启用选项对小数进行排序会numeric错误地比较小数。

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

结果在不同的浏览器中:

  • 铬 54 = 0
  • 火狐 49 = 0
  • 边 = -1
  • 即 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

4

1 回答 1

3

正如 André Bargull 在Firefox 错误报告中所观察到的,数字排序考虑十进制数字序列,即在数字的 Unicode 类别中,按其数值。也就是说,当比较两个包含十进制数字和小数部分的其他相同字符串时,不考虑整个十进制数字的数值——因为 U+002E FULL STOP 不在数字类别中(而是在标点符号中)类别)。

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

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

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

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

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

于 2016-10-25T15:09:16.630 回答