Произвольная точность чисел с плавающей точкой на JavaScript - PullRequest
5 голосов
/ 21 января 2010

У меня есть некоторые входы на моем сайте, представляющие числа с плавающей запятой с точностью до десяти цифр (в десятичном виде). В какой-то момент в коде проверки на стороне клиента мне нужно сравнить пару этих значений, чтобы увидеть, равны ли они или нет, и здесь, как и следовало ожидать, внутренняя часть IEEE754 делает эту простую проверку неудачной с такими вещами, как ( 2.0000000000 == 2.0000000001) = true.

Я могу разбить число с плавающей запятой на два длинных для каждой стороны точки, сделать каждую сторону длиной 64 бита и выполнить мои сравнения вручную, но это выглядит ужасно!

Любая приличная библиотека Javascript для обработки произвольных (или хотя бы гарантированных) чисел с плавающей точкой точности в Javascript?

Заранее спасибо!

PS: решение на основе GWT имеет ++

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Используйте целочисленную библиотеку произвольной точности, такую ​​как javascript-biginteger silentatht, которая может хранить и вычислять с целыми числами любого произвольного размера.

Поскольку вам нужно десять десятичных знаков, вам нужно сохранить значение n как n×10^10. Например, сохраните 1 как 10000000000 (десять нулей), 1.5 как 15000000000 (девять нулей) и т. Д. Чтобы отобразить значение для пользователя, просто поместите десятичную точку перед десятым последним символа (а затем, если хотите, обрежьте любые завершающие нули).

В качестве альтернативы вы можете хранить числитель и знаменатель в виде больших целых чисел, которые затем позволят вам произвольно точно определять дробные значения (но будьте осторожны - дробные значения имеют тенденцию очень быстро становиться очень большими).

1 голос
/ 21 января 2010

Библиотека GWT-MATH находится в http://code.google.com/p/gwt-math/.

Тем не менее, я предупреждаю вас, это GWT-наложение jsni для автоматического преобразования java-> javascript в java.BigDecimal (фактически старый com.ibm.math.BigDecimal).

Это работает, но быстро это не так. (И не худой. Он наберет хорошие 70 Кб в ваш проект).

На моем рабочем месте мы работаем с простой десятичной точкой с фиксированной запятой, но пока ничего не стоит выпускать. (

...