BigDecimal 值除法后的舍入问题。 Java

Issue with rounding aftrer division of BigDecimal values. Java

我对 BigDecimal 实例的除法结果有疑问。 我的程序:

public class 小数精度

public static void main(String[] args) {

    MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);
    System.out.println(new BigDecimal("0.1111111111111111111111111").divide(new BigDecimal("3"), mathContext).toString());

    }

结果如下: 0.03703703703703703703703703 但正确的结果是: 0.03703703703703703703703704

基本上我的程序将最后一位数字 7 四舍五入为 3,而不是 4。为什么会这样?在 mathContext 中,我指定了舍入模式 HALF_UP。可能我在这个问题上知识不足,但我确信 HALF_UP 舍入到更大的值。

这个问题可以通过以下方式解决:

    value1 = value1.divide(value2, 10000, RoundingMode.HALF_UP);
    return new BigDecimal(value1.toString()).round(mathContext);

但在我看来,将结果解析为字符串然后创建新的适当舍入的 BigDecimal 有点不对劲。我正在寻求您的帮助,如何在不求助于任何字符串的情况下解决此问题? 提前致谢。

您从 25 位数字开始并以 25 位精度执行运算,因此您可以预期最后一位数字可能是错误的。解决方案是使用比您需要更多的数字并四舍五入结果。

BigDecimal oneNinth25 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 25, BigDecimal.ROUND_HALF_UP);
BigDecimal oneNinth26 = BigDecimal.ONE.divide(BigDecimal.valueOf(9), 26, BigDecimal.ROUND_HALF_UP);
MathContext mathContext = new MathContext(25, RoundingMode.HALF_UP);

System.out.println("1/9 to 25 digits / 3 = " + 
                   oneNinth25.divide(BigDecimal.valueOf(3), mathContext));
System.out.println("1/9 to 26 digits / 3 = " + 
                   oneNinth26.divide(BigDecimal.valueOf(3), mathContext));

打印

1/9 to 25 digits / 3 = 0.03703703703703703703703703
1/9 to 26 digits / 3 = 0.03703703703703703703703704