BigDecimal Precision问题?

时间:2013-03-16 23:18:51

标签: java precision bigdecimal trailing

我正在编写一个程序,我必须在其中重复乘以两个BigDecimal

在第27次迭代之后,我得到:

0.905225895893387921845435055445776361046057346344145563957027726

使用此数字(BigDecimal * 0.182365681285)进行的任何进一步计算都会产生尾随零。所以下一次迭代会返回: 0.905225895893387921845435055445776361046057346344145563957027726000000000000

之后的迭代返回: 0.905225895893387921845435055445776361046057346344145563957027726000000000000000000000000

等。


所以我想知道这是否是由于BigDecimal的某些精确问题造成的。

感谢任何帮助

编辑:我被要求发布我的代码。我可以复制粘贴我所拥有的几页,但这是我目前所掌握的非常准确的表示:

BigDecimal range = new BigDecimal(0.0012440624293146346);
for(int i = 0; i < 50 ; i++){
    low = low.multiply(range);
}

2 个答案:

答案 0 :(得分:1)

multiply方法创建一个BigDecimal,其比例等于第一个操作数的比例+第二个操作数的比例,即使这会导致尾随零。要删除尾随零,请使用... stripTrailingZeros()

答案 1 :(得分:0)

我在模拟尾随零时发现了一种情况。

BigDecimal bd = BigDecimal.valueOf(0.5);
BigDecimal a = BigDecimal.valueOf(1 << 20).divide(BigDecimal.valueOf(1000000));
for (int i = 0; i < 20; i++) {
    System.out.println(a);
    a = a.multiply(bd);
}

注意:BigDecimal不会假设您希望默认情况下删除尾随零

1.048576
0.5242880
0.26214400
0.131072000
0.0655360000
0.03276800000
0.016384000000
0.0081920000000
0.00409600000000
0.002048000000000
0.0010240000000000
0.00051200000000000
0.000256000000000000
0.0001280000000000000
0.00006400000000000000
0.000032000000000000000
0.0000160000000000000000
0.00000800000000000000000
0.000004000000000000000000
0.0000020000000000000000000

没有理由你应该得到零,除非你每次都将转换为BigDecimal的双值相乘,否则不应该存在。