Переменные сумасшествие, число округления (int, double и т. Д.) - PullRequest
0 голосов
/ 12 ноября 2011

Это мой код, не полностью законченный, и извините за польский язык, но его легко получить. http://pastebin.com/QPmVaPFv Итак, речь идет о ветеринаре, 4 переменные для цены на посетителя: 1. Большая собака 2. Средняя собака 3. Маленькая собака 4.cat После этого следующие 4 переменные относятся к числу посетителей, как и прежде (большой, средний, маленький, кошка и т. Д.)

Тогда текст говорит: каждый 5-й владелец большой собаки получил скидку 10% каждый третий владелец среднего класса получает скидку 50% каждый 4-й владелец кошки получил цену в 1 $, т.е.

double zdpies=ldpies/5.;
double zspies=lspies/3.;
double zkot=ckot/4.;

Это та часть со скидками

После этого я сделал переменные с расчетами по сниженной цене

double cdpiespromo=cdpies/10.; Big dog
double cspiespromo=cspies/50.; medium dog
double ckotpromo=1; Cat

Затем я сделал расчет для окончательной цены, т.е. для нормальной цены без скидки

--- нормальные значения: 21,6 х 51,0 = 1101,6000000000001

Процесс завершен.

И я получил эти странные числа, 51. все в порядке, но 21.6 не так, должно быть 22, а не 21,6. Когда я использую «int», он говорит, что есть «потеря точности», есть идеи, как это исправить?

Вот последние переменные для расчета окончательной цены со скидкой и без скидки.

double idp=ldpies-zdpies; this calculates numbers of visitors without discount
double idc=idp*cdpies; this calculates price number of visitor * normalpriceofbigdog.

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Не используйте float или double для финансовых расчетов, используйте BigDecimal .

Поскольку работа с BigDecimal немного сложна, я написал класс BdHelper , чтобы сократить код, необходимый для определенных операций / преобразований.Класс не предназначен для завершения, я действительно написал только те методы, которые мне были необходимы, но вы поняли.Dev Days London.

0 голосов
/ 12 ноября 2011

Здесь есть отличная статья об использовании float, double, BigDecimal и т.д. для выполнения вычислений http://firstclassthoughts.co.uk/java/traps/java_double_traps.html

Суть в том, что не существует идеального решения.

0 голосов
/ 12 ноября 2011

Перейти с BigDecimal .Вот хорошее начало: Делайте центы с BigDecimal - JavaWorld .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...