浮点运算的结果不同

时间:2012-04-15 22:34:26

标签: java

我遇到一个小问题,我有一些代码可以计算一组给定数据的平均值,我是从几台不同的计算机上做的(有些是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的数字,而在其他情况下它会打印一个稍微大一些的数字。

3 个答案:

答案 0 :(得分:5)

如果确实在所有平台上都需要相同的错误,则应在方法声明中使用strictfp关键字,请在此帖子中查看所选答案:When should I use the "strictfp" keyword in java?

需要注意的是strictfp仅适用于您当前的块,并且不会通过代码传播,因此如果您在中间调用某些方法,它们也应该strictfp(也是您应使用StrictMath代替Math)。

无论如何,如果这不会影响你的代码,那么就让它......严格的浮点运算具有比常规浮点运算更高的计算成本。

答案 1 :(得分:2)

我认为这取决于所使用的编译器优化技术。例如。没有优化,你会得到很多补充,导致可能会失去精度,使用可以理解所涉及操作的编译器,整个循环可能会被counter = value*1000000替换

double的精度及其操作精确地以语言

设置

答案 2 :(得分:1)

不同的板块形式有不同的方式来表示浮点。

要获得相同的结果,您应该将精度限制为特定的小数位数。