Учтите, что налог в размере 10% применяется ко всем товарам, кроме продуктов питания. Кроме того, на ввозимые товары взимается дополнительный налог в размере 5 %.
Если стоимость музыкального компакт-диска составляет 12,49. Налог на товар составит 1.499. Если стоимость импортного флакона духов составляет 47,50, налог на товар составит 7,125.
Существует политика, согласно которой налоги на товар должны быть округлены до ближайшего 0,05. Следовательно, 1,499 следует округлить до 1,5, а 7,125 — до 7,25.
Вышеупомянутое требование округления может быть достигнуто с помощью логики:
(float) Math.ceil(taxAmount / 0.05f) * 0.05f;
Добавление налога к стоимости товара дает:
музыкальный компакт-диск: 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, тем самым изменяя требуемый результат.