Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Ошибка умножения (http://www.flasher.ru/forum/showthread.php?t=143876)

VARion 28.08.2010 00:04

Ошибка умножения
 
Всем привет.
Обнаружил следующую ошибку:
Код:

trace(1000 * 6 * 2.2);
Выдает: 13200.000000000002.
Откуда этот остаток .000000000002. Отчего происходит, ведь здесь и числа не большие и дробь примитивная?
Аналогичная ошибка ещё: 0.7 * 11000 = 7699.999999999999, должно быть 7700.
Может кто знает, как это можно решить?

-De- 28.08.2010 00:15

2.2 в двоичной системе - бесконечная дробь, оттого и хвост. Общего решения не существует. В данном случае можно записать выражение как 1000 * 6 * 22 / 10

VARion 28.08.2010 00:21

Спасибо. Не знал этого.
У меня в программе могут быть любые дроби (заранее не известно) как быть в таком случае?

-De- 28.08.2010 00:31

То, что выводится округлять, например. Что компьютер такие штуки не точно считает вроде общеизвестно. Если это что-то связанное с математикой, где нужна какая-то особая точность, то можно что-то мудрить, но тут надо уже под конкретную задачу делать.

VARion 28.08.2010 00:42

Про округление понятно, но не очень подходит - нужно для подсчёта стоимости.
Есть такой вариант: перед умножением каждый операнд проверять, сколько у него знаков после запятой, корректировать до целого. После получения результата делить на 1 с нужным числом нулей. Правда так и переполнение может быть ... но других вариантов пока не приходит.

-De- 28.08.2010 00:55

В случаях со стоимостью у вас не любые дроби, а где только два знака после запятой. Храните тогда умноженное на 100 целое (int) значение (ну т.е. в копейках/центах). Если деньги умножаются на некий коэффициент, то посчитал, округлил в какую надо сторону и записал опять в сумму на счету, которая int. Я так делаю. "Квадратных рублей", т.е. когда рубли множатся на рубли обычно не бывает %)

VARion 28.08.2010 00:59

Спасибо большое, очень помогли!
Так и сделаю.

Dimitry_II 28.08.2010 01:00

Я тоже с суммами оперирую как с числом центов, а не баксов - удобно хранить интеджер, удобно и точно оперировать, а как показывать - это уже фасад.

VARion 28.08.2010 01:13

Вот будет на одного теперь больше, кто этим методом пользуется.
Интересно получается, вроде бы программирование уже высокоуровневое давно, а всё же программисту нужно понимать как что внутри работает ... ))


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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.