неправильное десятичное число java и, следовательно, неправильное вычисление

#java #decimal

#java #десятичный

Вопрос:

Результат, который я получил, выглядит так:

 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??

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

спасибо 🙂

Комментарии:

1. .2f предлагает арифметику с плавающей запятой, которая не может быть точной.

Ответ №1:

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

Комментарии:

1. в настоящее время мой урок не распространяется на BigDecimal. я понятия не имею, как использовать это в моем coding D: есть другие идеи?

Ответ №2:

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

Комментарии:

1. в настоящее время мой урок не распространяется на BigDecimal. я понятия не имею, как использовать это в моем coding D: есть другие идеи?

2. скорее всего, никто никогда не будет преподавать класс на BigDecimal … Если вы пройдете страницу по ссылке или просто погуглите, вы найдете много информации и примеров об этом.

Ответ №3:

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

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

  • 11.825 * 100 = 1182.5
  • Math.round(1182.5) = 1183
  • 1183 / 100 = 11.83

Комментарии:

1. я могу сделать это, используя второе: D но math.round() еще не входит в мою учебную программу =.= так что делайте BigDecimal. так что я не знаю, как это сделать…

Ответ №4:

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

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

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

Комментарии:

1. Однако это не точно. Значения с плавающей запятой на самом деле не имеют десятичных разрядов, поэтому попытка округления или усечения до фиксированного числа десятичных разрядов является химерой.