对BigDecimal值进行四舍五入的划分问题。 Java的

时间:2015-07-28 10:36:33

标签: java rounding precision division bigdecimal

我对BigDecimal实例的划分结果有疑问。 我的节目:

public class DecimalPrecision

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);

但根据我的口味,将结果解析为String然后创建新的正确舍入的BigDecimal会出现问题。我在寻求你的帮助,如何在不诉诸任何字符串的情况下解决这个问题? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您从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