首页 文章

使用BigDecimal值舍入aftrer除法的问题 . Java的

提问于
浏览
0

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

公共类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会转向更大的 Value .

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

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

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

1 回答

  • 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
    

相关问题