#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. Однако это не точно. Значения с плавающей запятой на самом деле не имеют десятичных разрядов, поэтому попытка округления или усечения до фиксированного числа десятичных разрядов является химерой.