Java 大十进制精度问题?

Java 大十进制精度问题?,java,precision,bigdecimal,trailing,Java,Precision,Bigdecimal,Trailing,我正在编写一个程序,在这个程序中,我必须重复地将两个BigDecimal相乘 在第27次迭代之后,我得到: 0.905225895933879218454350554457776361046057344145563957027726 任何使用此数字的进一步计算(BigDecimal*0.182365681285)将导致尾随零。因此,下一次迭代返回: 0.905225895933879218454350554457763610460573441455639570277600000000000 之后

我正在编写一个程序,在这个程序中,我必须重复地将两个
BigDecimal
相乘

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

0.905225895933879218454350554457776361046057344145563957027726

任何使用此数字的进一步计算
(BigDecimal*0.182365681285)
将导致尾随零。因此,下一次迭代返回:
0.905225895933879218454350554457763610460573441455639570277600000000000

之后的迭代返回:
0.905225895933879218454350554457763610460573441455639570277600000000000000000

等等


所以我想知道这是否是由于
BigDecimal
的精度问题造成的

谢谢你的帮助

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

BigDecimal range = new BigDecimal(0.0012440624293146346);
for(int i = 0; i < 50 ; i++){
    low = low.multiply(range);
}
BigDecimal范围=新的BigDecimal(0.0012440624293146346);
对于(int i=0;i<50;i++){
低=低。乘法(范围);
}

乘法方法创建一个BigDecimal,其小数位数等于第一个操作数的小数位数+第二个操作数的小数位数,即使这会导致后面的零。要去除尾随零,请使用

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

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的双精度值相乘,否则没有理由得到不应该存在的零。

您可以发布完整的代码以便人们看到发生了什么吗?您不应该使用
double
构造函数(双精度缺少精度)-改用
字符串
构造函数。我试着去掉尾随的零,但这不是我想要得到的结果,我只是在第27次迭代和第50次迭代之间得到了相同的数字,这没有意义。@JohnMcBrown你是对的,没有意义。你能提供复制这个问题的代码吗?我必须道歉,但我必须链接数百个文件。我真的很感激到目前为止我得到的所有建议,我一定会改进它们。很高兴知道我不是在处理一个问题BigDecimal@JohnMcBrown这个答案的含义是,如果想要更高的精度,必须提高操作数的精度。原始操作数甚至没有它看起来具有的精度,因为编译器已经截断了该文本。将其作为字符串提供,而不是数字文字,如果需要,还可以调整BigDecimal的精度。在我的情况下,在第27次迭代之后,每次迭代都会得到完全相同的数字。去掉后面的零只会得到完全相同的数字。我不明白你为什么需要记录你乘以的值和得到的结果。这样,您应该能够用一行代码重现计算结果。您使用的是哪个版本的Java?如果您有一个旧版本的Java5.0,它可能是一个bug。
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