@topuserman

JavaScript: как складывать вещественные числа без погрешности?

У меня в массиве список вещественных чисел [0.00401, 0.1, 0.2, 44.21234]
Нужно получить сумму всех этих чисел.
Проблема в том, что при сложении разных вещественных чисел - набегает погрешность, а итоге в результате получается число, оканчивающийся на всякие 0000000004, 99999996 и т.д.
Округлять и ограничивать вывод кол-ва знаков после запятой нельзя, т.к. нужна точная цифра.
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 6
@bacon
decimal.js
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Нужно хранить вещественные числа, как целые.
И лишь при выводе их на экран, в файл и т.д. - переводить в вещественные.

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

Так что если вашему участку кода свыше приходит уже готовый массив в виде вещественных чисел, то никак.
Ответ написан
@McBernar
Умножить каждое число на 10/100/1000 (количество нулей зависит от количества знаков после запятой), провести операцию и ответ разделить на это число.
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Ответ написан
Комментировать
@zkrvndm
Боты, парсеры, расширения
Это известная проблема, решение простое - умножить до целого, повести нужные операции и вертать все обратно.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Причина этой погрешности в стандарте IEEE 754 Если коротко, то по умолчанию точностью пожертвовали ради скорости. И нет, это не только в js, это в большинстве языков так. (Подробнее расписано на 0.30000000000000004.com).

В качестве решения могу предложить обрабатывать ваши числа при помощи длинной арифметики, а хранить можно в виде строк.
Существуют готовые библиотеки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы