4

Intl.Collatorおよび有効にするオプションを使用して 10 進数を並べ替えると、10 進数がnumeric正しく比較されません。

一部のブラウザでは、「0.005」と「0.05」を比較すると、数値が同じであるため「0」が返されます。

さまざまなブラウザーでの結果:

  • クローム 54 = 0
  • Firefox 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

4

1 に答える 1

3

André Bargull がFirefox のバグ レポートで指摘しているように、数値の並べ替えでは、10 進数の数字列、つまり数値の Unicode カテゴリのみが数値によって考慮されます。つまり、10 進数と小数部を含む 2 つの同一の文字列を比較する場合、10 進数全体は数値として考慮されません。これは、U+002E FULL STOP が Number カテゴリに含まれていないためです (代わりに、Punctuation に含まれているためです)。カテゴリー)。

したがって、これら 2 つの文字列 ("0.05" と "0.000005") を比較すると、事実上これらの要素の配列を比較していることになります。

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

そして、数字の並びがその数値によって考慮されるとき、私たちは比較しています

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

これらは等しいので、compareそれらを比較すると 0 が返されます。Firefox と Chrome はここにあり、IE と Edge は間違っています。

于 2016-10-25T15:09:16.630 に答える