|
|
|||||
Регистрация: Apr 2008
Сообщений: 27
|
Ошибка умножения
Всем привет.
Обнаружил следующую ошибку: Выдает: 13200.000000000002. Откуда этот остаток .000000000002. Отчего происходит, ведь здесь и числа не большие и дробь примитивная? Аналогичная ошибка ещё: 0.7 * 11000 = 7699.999999999999, должно быть 7700. Может кто знает, как это можно решить? Последний раз редактировалось VARion; 28.08.2010 в 00:13. Причина: Дополнение |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
2.2 в двоичной системе - бесконечная дробь, оттого и хвост. Общего решения не существует. В данном случае можно записать выражение как 1000 * 6 * 22 / 10
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Apr 2008
Сообщений: 27
|
Спасибо. Не знал этого.
У меня в программе могут быть любые дроби (заранее не известно) как быть в таком случае? |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
То, что выводится округлять, например. Что компьютер такие штуки не точно считает вроде общеизвестно. Если это что-то связанное с математикой, где нужна какая-то особая точность, то можно что-то мудрить, но тут надо уже под конкретную задачу делать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Apr 2008
Сообщений: 27
|
Про округление понятно, но не очень подходит - нужно для подсчёта стоимости.
Есть такой вариант: перед умножением каждый операнд проверять, сколько у него знаков после запятой, корректировать до целого. После получения результата делить на 1 с нужным числом нулей. Правда так и переполнение может быть ... но других вариантов пока не приходит. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
В случаях со стоимостью у вас не любые дроби, а где только два знака после запятой. Храните тогда умноженное на 100 целое (int) значение (ну т.е. в копейках/центах). Если деньги умножаются на некий коэффициент, то посчитал, округлил в какую надо сторону и записал опять в сумму на счету, которая int. Я так делаю. "Квадратных рублей", т.е. когда рубли множатся на рубли обычно не бывает %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Apr 2008
Сообщений: 27
|
Спасибо большое, очень помогли!
Так и сделаю. |
|
|||||
Регистрация: Jan 2010
Сообщений: 211
|
Я тоже с суммами оперирую как с числом центов, а не баксов - удобно хранить интеджер, удобно и точно оперировать, а как показывать - это уже фасад.
|
|
|||||
Регистрация: Apr 2008
Сообщений: 27
|
Вот будет на одного теперь больше, кто этим методом пользуется.
Интересно получается, вроде бы программирование уже высокоуровневое давно, а всё же программисту нужно понимать как что внутри работает ... )) |
Часовой пояс GMT +4, время: 13:27. |
|
« Предыдущая тема | Следующая тема » |
Теги |
flex , ошибка , умножение |
Опции темы | |
Опции просмотра | |
|
|