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, чтобы избавиться от десятичных знаков