неправильный десятичный код Java и, следовательно, неправильный расчет - PullRequest
0 голосов
/ 28 октября 2011

Вывод, который я получил, выглядит так:

number of bags ordered : 43 ($236.50)

discount : 5% ($11.83)

total cost : $224.68

эта правильная общая стоимость должна составлять 224.67, потому что 236.50 - 11.83 = 224.67

скидка, которую я получил при использовании %.2f показывает 11.83, где первоначальное значение 11.825

total cost = bags ordered - discount

224.68 != 236.50 - 11.825 = 224.675

и только потому, что я получил округленное значение, и я не хочу 224.68, но 224.67.

как убедиться, что это 236.50-11.83 = 224.67, но не 236.50-11.825 = 224.675 ??

кто-нибудь, пожалуйста, помогите мне с этим> <</p>

спасибо:)

Ответы [ 4 ]

3 голосов
/ 28 октября 2011

Не используйте числа с плавающей точкой для расчетов в валюте - используйте десятичные классы !

1 голос
/ 28 октября 2011

Возможно, вы захотите перейти на класс BigDecimal.Функция setScale (int newScale, RoundingMode roundingMode) может предоставить вам полный контроль над десятичными разрядами.

0 голосов
/ 28 октября 2011

Поскольку вам не нужно использовать другие библиотечные классы, вы все равно можете реализовать свой собственный метод округления.

public static float round(float val) {
   return (val*100.0 + 0.5) / 100.0;
}

для округления значений перед их использованием в последующих операциях.

0 голосов
/ 28 октября 2011

Арифметика с плавающей запятой - зло для фиксированных десятичных знаков, таких как единица в валюте. Просто используйте целые числа и отформатируйте вывод, чтобы у вас было две цифры, разделенные ., что избавит вас от многих головных болей.

Если вы действительно хотите сохранить числа с плавающей запятой, вы должны сделать несколько трюков с округлением и умножением / делением, чтобы вы фактически делали то же самое округление, которое печаталось, например:

  • 11,825 * 100 = 1182,5
  • Math.round (1182,5) = 1183
  • 1183/100 = 11,83
...