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 中的比例时遇到任何问题,请告诉我。如果有人让我知道如何用计算器得出相同的结果,那将会很有帮助。
您要求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似乎毫无意义。
除非明确需要,否则尽可能晚地进行舍入(如果有的话)。