Вычисление больших десятичных знаков (более 15 цифр) в Javascript

Как мы знаем, у Javascript есть некоторые проблемы (или особенности) с вычислением десятичных чисел. Например:

console.log(0.1 + 0.2) // 0.30000000000000004

И мы знаем, что этого можно избежать, используя разные библиотеки (например, я использую bignumber.js ), и теперь у нас есть то, что ожидалось:

console.log(Number(new BigNumber(0.1).plus(0.2))); // 0.3
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

НО

Bignumber.js имеет ограничения:

Он принимает значение типа номер (только до 15 значащих цифр), строку или объект BigNumber.

Мы можем передать строку (это возможно), но таким образом мы можем потерять несколько цифр с конца:

console.log(Number(new BigNumber(0.1).plus("198.43092534959501"))); // 198.530925349595, not 198.53092534959501
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

Сейчас я работаю с криптовалютами и часто имею дело с числами типа 198.43092534959501, и в этом случае я получаю ошибку (как и ожидалось):

console.log(Number(new BigNumber(0.1).plus(198.43092534959501))); // error
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

Я знаю, что некоторые люди используют дополнительные множители, но в приведенном выше случае это не сработает. Если вы имеете дело с криптовалютами, вы знаете, что на самом деле мы работаем с не умноженными и умноженными значениями (например, 489964999999000000 и 0.489964999999). Но моя цель на данный момент - суммировать все остатки фиатных денег для разных валют, но у них разные множители, поэтому я не могу просто суммировать не умноженные значения, и, похоже, мне нужно как-то суммировать умноженные значения.

Это была небольшая предыстория, но мой общий вопрос:

Как суммировать / умножать / и т. Д. десятичные числа, в которых больше 15 цифр?


person Commercial Suicide    schedule 03.04.2018    source источник
comment
Я думаю, вы ответили на свой вопрос в фоновом режиме. Он говорит, что BigNumber примет в качестве входных данных число, отформатированное как строку.   -  person nbering    schedule 03.04.2018
comment
0.1 - это не десятичное число, а тип данных с плавающей запятой. И эти типы данных с плавающей запятой не подходят для десятичных вычислений, потому что они служат другой цели. И это касается не только JS, но и любого другого языка.   -  person t.niese    schedule 03.04.2018


Ответы (1)


Я уже ответил на это в комментарии, но вот демонстрация. BigNumber примет для ввода число в строковом формате.

console.log(new BigNumber(0.1).plus("198.43092534959501"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>

person nbering    schedule 03.04.2018
comment
Да, работает, спасибо, но в этом случае теряются последние 2 цифры. Есть ли способ сохранить полный номер? - person Commercial Suicide; 03.04.2018
comment
Не превращайте его обратно в Number и сохраняйте то количество цифр, которое у вас настроено в BigDecimal, верно? - person Scott Sauyet; 03.04.2018
comment
Я обновил ответ. Последние цифры были потеряны, потому что ваш образец вернул их к числу. Просто всегда сохраняйте числа в виде строки или BigNumber. - person nbering; 03.04.2018
comment
Хороший ответ, спасибо (и @ScottSauyet тоже)! Я надеялся, что у нас получится с цифрами, но если нет - ничего, поправлюсь. Спасибо еще раз! - person Commercial Suicide; 03.04.2018
comment
В JavaScript невозможно сохранить такую ​​степень точности. Число битов разрешения включено в спецификацию языка, поэтому для обработки всего такого большого требуются библиотеки. Я боролся с тем же самым, играя с форматами файлов с криптографическими ключами в NodeJS. - person nbering; 03.04.2018
comment
С цифрами это делать не имеет смысла. Если бы JS Numbers мог справиться с этим, тогда не было бы необходимости в библиотеке BigNumber или ее партнерах. - person Scott Sauyet; 03.04.2018
comment
@ScottSauyet, спасибо, хорошее предложение. Основная идея теперь для меня более ясна. - person Commercial Suicide; 03.04.2018