为什么BigDecimal在四舍五入后返回这个值?

时间:2017-07-12 12:01:31

标签: java double bigdecimal

为什么BigDecimal在四舍五入而不是预期值后返回此值,我该如何达到此值?

// EXPECTED 0.45
// RETURNS 0.45
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.45"))
                             .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());

// EXPECTED 0.45
// RETURNS 0.45
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.445"))
                             .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());

// EXPECTED 0.45
// RETURNS 0.44
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.4445"))
                             .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString());

1 个答案:

答案 0 :(得分:1)

这是文字问题的答案

  

为什么BigDecimal会在舍入到一半之后返回此值   预期价值,我怎么能达到这个目标?

应用于0.4445舍入到0.44而不是“预期”0.45。

BigDecimal.ROUND_HALF_UP定义为

  

舍入模式向“最近邻居”舍入,除非两者都是   邻居是等距的,在这种情况下会进行整理。

比例因子两个邻居是0.44和0.45。 0.4445和0.44之间的绝对差值为0.0045。 0.4445和0.45之间的绝对差值为0.0055。邻居不是等距的,0.44是最近的邻居。

如果您真的想要一个奇怪且不必要的不​​准确的舍入模式,请使用BigDecimal的toString方法来获取完整的String表示。然后,您可以使用String操作以任何方式对其进行修改。