Подтвердить что ты не робот

JavaScript: десятичные значения

Что я могу использовать в качестве десятичного типа в JavaScript? Он не поддерживается (0.1 + 0.2 !== 0.3), и мне это нужно для представления точных значений в банковском/финансовом приложении. См. Состояние и будущее JavaScript для хорошего чтения и грязных деталей JavaScript и его (отсутствия) поддержки десятичной арифметики.

Под "десятичным" подразумевается либо:

  • бесконечный диапазон и произвольная точность (например, BigDecimal в Java) или
  • ограниченный диапазон и точность, но подходит для финансовых расчетов (например, decimal в С#).

Итак, какая библиотека или решение существует для работы с десятичными значениями? Спасибо!

4b9b3361

Ответ 1

Часто рекомендуется 1 обрабатывать деньги как целое число, представляющее число центов: 2572 центов вместо 25.72 долларов. Это делается для того, чтобы избежать проблем с арифметикой с плавающей запятой, о которой вы упоминаете. К счастью, целочисленная арифметика в плавающей точке является точной, поэтому ошибки десятичного представления можно избежать путем масштабирования.


1 Дуглас Крокфорд: JavaScript: Хорошие детали: Приложение A - Ужасные части (стр. 105).

Ответ 2

Javascript имеет поддержку с плавающей запятой. Но в любом случае для финансовых записей простейшая реализация просто сохранит ваши значения в стандартных целых числах. Вы можете либо объявить целое число, чтобы представить сумму в центах, либо два целых числа один за доллары и один за центы.

Таким образом, 18,57 доллара США станут 1857 процентами в первой технике или 18 долларов и 57 центов во втором.

У этого есть дополнительное преимущество, заключающееся в том, что он полностью точен, поскольку целые числа хранятся исключительно как уникальное двоичное представление, не было бы такой вещи, как ошибки округления.

Ответ 4

Кажется, что следующая библиотека реализует десятичное значение в js (node и в браузере): https://npmjs.org/package/jsdecimal