Intl.Collator и естественная сортировка с числовым параметром сортирует некорректно с десятичными числами

Сортировка десятичных чисел с помощью Intl.Collator и возможность включить numeric неправильно сравнивает десятичные дроби.

В некоторых браузерах сравнение "0,005" и "0,05" возвращает "0", так как цифры одинаковы.

Результаты в разных браузерах:

  • Chrome 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

2 ответа

Решение

Как замечает Андре Баргул в отчете об ошибках в Firefox, числовая сортировка учитывает только последовательности десятичных цифр, то есть в категории "Число" в Юникоде, по числовым значениям. То есть, при сравнении двух строк, идентичных в других отношениях, содержащих десятичные числа с дробными компонентами, целые десятичные числа не учитываются в качестве их числового значения - потому что U+002E FULL STOP не относится к категории Number (вместо этого он находится в знаке препинания) категория).

Итак, когда мы сравниваем эти две строки - "0,05" и "0,000005" - мы эффективно сравниваем эти массивы элементов:

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

а затем, когда последовательности цифр рассматриваются их числовые значения, мы сравниваем

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

которые равны и так compare должен возвращать 0 при сравнении их. Firefox и Chrome прямо здесь, а IE и Edge ошибаются.

Обходной путь

Умножьте значения на 100_000_000, чтобы избавиться от десятичных знаков

Другие вопросы по тегам