Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大十进制值除法后的四舍五入问题。JAVA_Java_Rounding_Precision_Division_Bigdecimal - Fatal编程技术网

大十进制值除法后的四舍五入问题。JAVA

大十进制值除法后的四舍五入问题。JAVA,java,rounding,precision,division,bigdecimal,Java,Rounding,Precision,Division,Bigdecimal,我对BigDecimal实例的除法结果有一个问题。 我的节目: 公共类决策精度 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")

我对BigDecimal实例的除法结果有一个问题。 我的节目:

公共类决策精度

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.03703703703703703703703703704

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

这个问题可以用下一种方法解决:

    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