JavaScript: десятичные значения - PullRequest
25 голосов
/ 11 августа 2010

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 11 августа 2010

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


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

5 голосов
/ 11 августа 2010

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

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

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

3 голосов
/ 11 августа 2010

Взгляните на BigNumber и на этот пост .

2 голосов
/ 05 февраля 2014

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

...