JavaScript: как складывать вещественные числа без погрешности?
У меня в массиве список вещественных чисел [0.00401, 0.1, 0.2, 44.21234]
Нужно получить сумму всех этих чисел.
Проблема в том, что при сложении разных вещественных чисел - набегает погрешность, а итоге в результате получается число, оканчивающийся на всякие 0000000004, 99999996 и т.д.
Округлять и ограничивать вывод кол-ва знаков после запятой нельзя, т.к. нужна точная цифра.
Округлять и ограничивать вывод кол-ва знаков после запятой нельзя, т.к. нужна точная цифра.
С такими условиями придётся работать уже не с числами, а со строками чисел. Думаю, есть библиотеки для этого, иначе все математические операции придётся реализовать самому.
Нужно хранить вещественные числа, как целые.
И лишь при выводе их на экран, в файл и т.д. - переводить в вещественные.
Очевидно, что любые вещественные числа стандартным способом хранить нельзя (впрочем, как и любые целые) из-за ограничений точности. Если очень нужно медленное универсальное решение, то можно своё решение написать (например, хранить числа в виде строк и складывать поразрядно своими функциями). Ведь строки условно бесконечны. Но в этом случае также накладывается условие на формат хранения.
Так что если вашему участку кода свыше приходит уже готовый массив в виде вещественных чисел, то никак.
wisgest, из входных данных с ограниченной точностью? Если не надо производить деление, то бесконечная дробь никак не получится. Впрочем, и это не проблема, поскольку на выходе мы должны получить число, а значит точность ограничена 16 знаками после запятой.
Странный вывод, что мешает их преобразовать в строку и делать с ними что захочешь?
Если нужно результат снова перевести в вещественное число, то мешает то, что если в каждом исходном числе использовано максимум разрядов, то сумма может использовать ещё больше разрядов (мантисса переполнится).
100000000000000 + 0.00000000000001 = ?
Причина этой погрешности в стандарте IEEE 754 Если коротко, то по умолчанию точностью пожертвовали ради скорости. И нет, это не только в js, это в большинстве языков так. (Подробнее расписано на 0.30000000000000004.com).