2010-08-11 1 views
23

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

К «десятичном», я имею в виду как:

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

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

+1

@TimAbell неподвижный, теперь указует ссылку на видео на YT. –

ответ

4

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

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

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

+1

Да, JavaScript имеет двоичную с плавающей запятой, что является плохим выбором для 99% приложений, использующих JavaScript. Существуют ли какие-либо библиотеки JavaScript, которые абстрагируют понятие десятичного числа для меня? –

+2

Не проще ли просто хранить его как целое, как мой пример? Все десятичные реализации имели бы присущие неточности из-за того, как архитектура представляет собой плавающие точки. Не беспокойтесь о переполнении, даже государственный долг США будет соответствовать аккуратно в 64-битном int. –

+2

Целочисленная часть плавающей запятой JavaScript меньше 64 бит. –

12

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


Douglas Крокфорд: JavaScript: The Good Parts: Appendix A - Awful Parts (page 105).

+0

Сколько битов доступно в целочисленной части плавающей запятой JavaScript? Я мог бы сжать все это. –

+0

@Mr. X: почти наверняка 53 или более. – ysth

+0

@Mr. X: посмотрите http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to, и это: http : //stackoverflow.com/questions/3428136/javascript-integer-math-incorrect-results –

3

Взгляните на BigNumber и that post.

+1

Просто глядя на этот код, я хочу плакать. Интересная идея, хотя, но она сосет, чтобы не иметь возможности использовать обычные операторы '+ -/*' и т. Д. – adamJLev