@topuserman

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽