java - 在 Java 中四舍五入到最接近的 0.05 的最佳方法

标签 java bigdecimal rounding

请考虑对除食品以外的所有商品征收 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 这两个 float 相加时,我们得到的结果为 12.450001。与其他输入不同,此特定输入给出了很多小数位,而不是其他输出中的 2 位小数。

我尝试使用 BigDecimal 而不是 float 来存储所有小数点后 2 位小数位的值。这种方法的问题在于,如果未指定舍入策略,bigDecimal 会在某些情况下抛出异常。为 BigDecimal 提供舍入策略会导致使用提供给 BigDecimal 的舍入策略对项目成本和适用税的总和进行舍入,从而改变所需的输出。

最佳答案

你可以使用 long 而不是 double 来使用 double 你可以做到

double d = Math.round(d * 20) / 20.0; // round up to multiple of 0.05

使用长(分)

long l = (l + 3) / 5 * 5;

尽管通常认为使用 intlongBigDecimal 是最佳实践,但大多数投资银行和基金都使用 double 因为一旦您了解了如何安全地使用它们,它们使用起来就会更简单(比 long )更快(比 BigDecimal)。

关于java - 在 Java 中四舍五入到最接近的 0.05 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815135/

相关文章:

java - 使用 Byte Buddy 将 DTO 转换为实体的注释

java - 在将 mahout 与 map reduce 程序集成时,我在解析 XML 时遇到此错误

java - 位置管理器的 AddGpsStatusListener 在 Android 10 中不起作用

java - Java 中的大数比较

java - Hibernate 错误地映射 BigDecimal

decimal - BigDecimal 在 idris 中的实现

java - Java 中的惰性日志消息评估

java - 不同的舍入方法似乎不起作用

java - 舍入不起作用

python - 在 Python 中减去 numpy 数组时不需要的舍入