我遇到一个小问题,我有一些代码可以计算一组给定数据的平均值,我是从几台不同的计算机上做的(有些是linux,有些是windows,有些是32位,有些是64位),但是当我观察数据库结果时,一些应该相等的值会略有不同。
这对我的程序没有任何影响,但我想知道为什么会这样,我的印象是使用相同单词lenght的浮点运算应该产生相同的结果(我显然是错的)。
这是我写的一个小样本代码,用于检查:
public class Test{
public static void main(String... args){
double counter = 0, value = 1./10;
for (int i = 0; i < 1000000; i++){
counter += value;
}
System.out.println(counter);
}
}
它基本上计算1000000/10,我知道结果不准确,但在某些pc中它会打印一个略小于100000的数字,而在其他情况下它会打印一个稍微大一些的数字。
答案 0 :(得分:5)
如果确实在所有平台上都需要相同的错误,则应在方法声明中使用strictfp
关键字,请在此帖子中查看所选答案:When should I use the "strictfp" keyword in java?
需要注意的是strictfp
仅适用于您当前的块,并且不会通过代码传播,因此如果您在中间调用某些方法,它们也应该strictfp
(也是您应使用StrictMath
代替Math
)。
无论如何,如果这不会影响你的代码,那么就让它......严格的浮点运算具有比常规浮点运算更高的计算成本。
答案 1 :(得分:2)
我认为这取决于所使用的编译器优化技术。例如。没有优化,你会得到很多补充,导致可能会失去精度,使用可以理解所涉及操作的编译器,整个循环可能会被counter = value*1000000
替换
double
的精度及其操作精确地以语言
答案 2 :(得分:1)
不同的板块形式有不同的方式来表示浮点。
要获得相同的结果,您应该将精度限制为特定的小数位数。