BigDecimal.Divide 给出不正确的结果

Sum*_*man 0 java math bigdecimal

使用 BigDecimal 执行除法时得到不正确的结果。number1 = 221500.0 number2 = 12.0 这是我的代码片段:

BigDecimal d1 = new BigDecimal(String.valueOf(number1)).setScale(13, 4);
BigDecimal d2 = new BigDecimal(String.valueOf(number2)).setScale(13, 4);
return (d1.divide(d2, 13, 4 )).doubleValue();
Run Code Online (Sandbox Code Playgroud)

18458.333333333332

如果我使用计算器执行相同的计算,它会给出 18458.333333333333333333333333333

如果在处理 BigDecimal 中的比例时遇到任何问题,请告诉我。如果有人让我知道如何用计算器得出相同的结果,那将会很有帮助。

And*_*eas 5

您要求divide()调用提供 13 位精度,这就是它给您的。

然后您将其转换为double并注意到double无法处理该精度。

BigDecimal d1 = new BigDecimal(String.valueOf(221500.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d2 = new BigDecimal(String.valueOf(12.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d3 = d1.divide(d2, 13, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal: " + d3);
System.out.println("as double : " + d3.doubleValue());
Run Code Online (Sandbox Code Playgroud)

输出

BigDecimal d1 = new BigDecimal(String.valueOf(221500.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d2 = new BigDecimal(String.valueOf(12.0)).setScale(13, BigDecimal.ROUND_HALF_UP);
BigDecimal d3 = d1.divide(d2, 13, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal: " + d3);
System.out.println("as double : " + d3.doubleValue());
Run Code Online (Sandbox Code Playgroud)

如果您打算放弃使用 获得的额外精度BigDecimal,为什么不直接在 中进行数学计算呢double


另一方面:
不要这样做new BigDecimal(String.valueOf(doubleValue))
使用BigDecimal.valueOf(doubleValue)

d1设置和的比例d2似乎毫无意义。
除非明确需要,否则尽可能晚地进行舍入(如果有的话)。

  • @Andreas 的意思是,不要调用 .doubleValue() ,因为这样做会将您的高精度数字转换为不太精确的双精度数 (2认同)