【发布时间】:2012-08-05 08:51:54
【问题描述】:
考虑到 10% 的税适用于除食品以外的所有物品。此外,对进口商品征收 5% 的附加税。
如果音乐 CD 的成本是 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;
将税收添加到物品的成本中:
音乐 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 的舍入策略对项目成本和适用税费的总和进行舍入,从而改变所需的输出。
【问题讨论】:
-
回复:BigDecimal 的“问题”,是的,提供舍入策略的全部意义在于应该使用它。显然它会改变结果。您的问题很可能是您提供了错误的政策。
-
AFAIK,BigDecimal 提供的所有政策都不符合我的要求。
-
您是否使用了正确的缩放比例?如果你是,那么 ROUND_HALF_XXX 模式之一就是你想要的。
-
我使用的是 2 的比例。正确吗?
-
令人惊讶的是,使用任何 ROUND_HALF_XXX 方法和 2 的比例都可以解决问题。
标签: java bigdecimal rounding