使用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();
18458.333333333332
如果我使用它给出的计算器执行相同的计算 18458.333333333333333333333333333
让我知道在BigDecimal中处理比例的任何问题。如果有人让我知道如何用计算器得到相同的结果,将会很有帮助。
答案 0 :(得分:4)
您向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());
<强>输出强>
BigDecimal: 18458.3333333333333
as double : 18458.333333333332
如果您要丢弃使用BigDecimal
获得的额外精确度,为什么不在double
进行数学运算?
另一方面:
不要做new BigDecimal(String.valueOf(doubleValue))
使用BigDecimal.valueOf(doubleValue)
。
设置d1
和d2
的比例似乎毫无意义
除非明确需要,否则尽可能晚,如果有的话。
答案 1 :(得分:3)
有些事情你会做不同的事情。
如您所知,BigDecimal是一个很棒的工具,因为:
它可以精确地保留十进制数字,不像任何浮点表示,例如 double 或 float
它可以使用任意大十进制数,与 int , double 和 float
然而,为了使其有效,你应该记住一些事情:
将值设置为BigDecimal时,始终使用字符串表示形式,因为只有String表示形式才能处理小数精度。例如,新的BigDecimal(String.valueOf(number1))是个坏主意,如果number是double(无法处理精确的小数),那么你将把不准确的数字转换为BigDecimal。
创建BigDecimal时不要限制精度。通常BigDecimal会保持输入的精度,即新的BigDecimal(“3.234”)将有3位十进制数字。
在每次除法后设置roudingMode。有关可能的路由模式,请参阅JavaDoc,HALF_EVEN是常用用例的最佳选择。
在除法时设置小数精度,因为除法可能会导致无穷小的小数。
考虑这个例子:
public class BigDecimalTest {
public static void main(final String[] args) {
final BigDecimal d1 = new BigDecimal("221500");
final BigDecimal d2 = new BigDecimal("12");
final BigDecimal result=d1.divide(d2,30,RoundingMode.HALF_EVEN);
System.out.println(result);
}
}
给出了
18458.333333333333333333333333333333
请求所有30位小数。随意改变30到300,这给了
18458.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
很多比计算器好,不是吗? :)