Учитывайте, что налог на 10% распространяется на все предметы, кроме продуктов питания. Кроме того, дополнительный налог в размере 5% применим к импортируемым товарам.Лучший способ округления до ближайшего 0.05 в java
Если стоимость музыкального компакт-диска составляет 12,49. Налог на этот предмет будет 1,499. Если стоимость импортированной бутылки парфюма составляет 47,50, налог на товар будет 7,255
Существует политика, в которой говорится, что налоги на товар должны округляться до ближайшего 0,05. Поэтому 1.499 следует округлить до 1,5 и 7.125 следует округлить до 7,25.
выше округление Requirment может быть достигнуто с помощью логики:
(float) Math.ceil(taxAmount/0.05f) * 0.05f;
Добавление налога в стоимости товара дает:
музыка CD: 12,49 + 1,5 = 13,99 импортирован коробка конфет : 47,50 + 7,25 = 54,65.
Я столкнулся с проблемой для следующего ввода:
Если стоимость импортируемых коробков конфет является 11,85, налог будет 0.5925
Используя округление политика, налог после округления будет 0.6.
Когда мы добавляем 11.85 + 0.6, которые являются поплавками, получаем результат как 12.450001. В отличие от других входов, этот конкретный вход дает много десятичных знаков, а не 2 десятичных разряда на других выходах.
Я попытался использовать BigDecimal вместо float, чтобы сохранить все значения с шкалой, установленной на 2 десятичных знака. Проблема с этим подходом заключается в том, что bigDecimal будет генерировать исключение для некоторых случаев, если политика округления не указана. Предоставление политики округления для BigDecimal приводит к тому, что общая сумма стоимости предмета и применимого налога округляется с использованием политики округления, предоставляемой BigDecimal, таким образом изменяя требуемый результат.
Re: Ваша «проблема» с BigDecimal, да, цель обеспечения политики округления заключается в том, что она должна использоваться. И, очевидно, это изменит результат. Вероятно, ваша проблема связана с политикой WRONG. –
AFAIK, ни одна из политик, предоставляемых BigDecimal, не будет соответствовать моему требованию. – CKing
Вы используете правильное масштабирование? Если да, то один из режимов ROUND_HALF_XXX - это то, что вы хотите. –