0

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

第 27 次迭代后,我得到:

0.905225895893387921845435055445776361046057346344145563957027726

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

之后的迭代返回: 0.905225895893387921845435055445776361046057346344145563957027726000000000000000000000000

ETC..


所以我想知道这是否是由于BigDecimal.

任何帮助表示赞赏

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

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

2 回答 2

1

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

于 2013-03-16T23:31:57.440 回答
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 的双精度值相乘。

于 2013-03-16T23:32:16.990 回答