JavaScript: десятичные значения
Что я могу использовать в качестве десятичного типа в JavaScript? Он не поддерживается (0.1 + 0.2 !== 0.3
), и мне это нужно для представления точных значений в банковском/финансовом приложении. См. Состояние и будущее JavaScript для хорошего чтения и грязных деталей JavaScript и его (отсутствия) поддержки десятичной арифметики.
Под "десятичным" подразумевается либо:
- бесконечный диапазон и произвольная точность (например,
BigDecimal
в Java) или
- ограниченный диапазон и точность, но подходит для финансовых расчетов (например,
decimal
в С#).
Итак, какая библиотека или решение существует для работы с десятичными значениями? Спасибо!
Ответы
Ответ 1
Часто рекомендуется 1 обрабатывать деньги как целое число, представляющее число центов: 2572
центов вместо 25.72
долларов. Это делается для того, чтобы избежать проблем с арифметикой с плавающей запятой, о которой вы упоминаете. К счастью, целочисленная арифметика в плавающей точке является точной, поэтому ошибки десятичного представления можно избежать путем масштабирования.
1 Дуглас Крокфорд: JavaScript: Хорошие детали: Приложение A - Ужасные части (стр. 105).
Ответ 2
Javascript имеет поддержку с плавающей запятой. Но в любом случае для финансовых записей простейшая реализация просто сохранит ваши значения в стандартных целых числах. Вы можете либо объявить целое число, чтобы представить сумму в центах, либо два целых числа один за доллары и один за центы.
Таким образом, 18,57 доллара США станут 1857 процентами в первой технике или 18 долларов и 57 центов во втором.
У этого есть дополнительное преимущество, заключающееся в том, что он полностью точен, поскольку целые числа хранятся исключительно как уникальное двоичное представление, не было бы такой вещи, как ошибки округления.
Ответ 3
Посмотрите BigNumber и чтобы опубликовать.
Ответ 4
Кажется, что следующая библиотека реализует десятичное значение в js (node и в браузере):
https://npmjs.org/package/jsdecimal