Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сложение дробных чисел (https://javascript.ru/forum/misc/24690-slozhenie-drobnykh-chisel.html)

demoniqus 10.01.2012 20:32

Сложение дробных чисел
 
Javascript меня сегодня замучил.
Сделал небольшое приложение на смеси JavaScript + PHP. Одной из функций данного приложения является оприходование товара. Форма строится следующим образом: сначала я ввожу общие итоги (для будущей сверки), а потом уже ввожу детализацию. При отправке формы производится проверка - суммируются определенные поля типа TEXT и сверяются с введенными первоначально итогами.
Вбиваю в детализацию числа (4589; 2111.2; 3046.1; 964.5; 22.40; 67.8; 448.4) - сумма должна быть 11249.4 (проверял в Excel и на калькуляторе), а JavaScript выдает 11249,39 хоть ты его тресни. Та же ситуация с числами (31.56; 14.16; 22.05; 6.48; 0.14; 0.43; 3.19) - сумма должна быть 78.01, а JavaScript утверждает, что получается всего лишь 78. Теперь второй прикол - с первой группой чисел я просто увеличил произвольное число на 0.01 и и JavaScript выдал результат 11249.4. А вот со второй группой фокус не удался, т.к. JavaScript был окончательно пьян - при увеличении любого произвольного числа на 0.01 результат стал 78.02! При увеличении еще на 0.01 результат стал 78.03... Даже не знаю, какой из этих смайлов :lol: или:help: или:blink: или :cray: ставить...
Я решил проверить, на каком из чисел происходит ошибка - в первой группе числа по 964.5 суммировались правильно, а 22.4 потащило ошибку. Во второй группе последнее число привело к ошибке.
В PHP я сталкивался с чем-то подобным - там с дробными числами тоже происходил порой глюк - приписывались какие-то миллионные-миллиардные доли. Там я избавился путем отсекания у строкового представления числа всех лишних цифр. И здесь решил пойти пока тем же путем... Может кто-нибудь подсказать нормальный выход или лучше самому описать математические действия заново?

Aetae 10.01.2012 20:42

alert(4589+2111.2+3046.1+964.5+22.40+67.8+448.4);

не 11249,39, а 11249.399999999998
это особенность, ёе не исправить в js, только округлять

Magneto 10.01.2012 21:15

Я уже отвечал на этот вопрос.


Часовой пояс GMT +3, время: 12:44.