Java在小数位之间进行双倍计算

时间:2014-02-12 15:05:34

标签: java double

private void fillInState() {
    state [0][0] = 0.6;
    state [0][1] = 0.4;
    state [1][0] = 0.3;
    state [1][1] = 0.6;
    state [1][2] = 0.1;
    state [2][0] = 0.7;
    state [2][2] = 0.3;
}


private void fillInNext() {
    next [0][0] = 1.0;
}

public void chain (int time) { 
    for(int i=0; i<time;i++) {
        for( int j=0; j<3;j++) { 
            double temp = 0;
            for(int k=0;k<3;k++) {
                temp = state[k][j] * next [k][i] + temp;

                if(k==2) {
                    next[j][i+1]=temp;                   
                }
            }
        }
    }
}

预期答案应为:

1.0 0.6 0.48  
0.0 0.4 0.48  
0.0 0.0 0.04

但是blueJ的答案是:

1.0 0.6 0.48  
0.0 0.4 0.48  
0.0 0.0 0.04000000000000001  

有谁知道发生了什么?是关于Double类还是blueJ?

2 个答案:

答案 0 :(得分:1)

这仅仅归因于floating-point errors。您始终可以使用printf:

之类的格式设置输出格式
double d = 0.04000000000000001;
System.out.println(d);
System.out.printf("%.2f%n", d);
0.04000000000000001
0.04

请参阅Oracle的教程Formatting Numeric Print Output

答案 1 :(得分:0)

这是因为浮点运算如何工作。尝试查看this的详细信息。基本上,不可能使用正常的浮点表示法在有限数量的二进制数字中表示任意十进制数字。

如果您需要算术与Decimals紧密匹配,请使用BigDecimal

通常,您可以通过将输出的结果四舍五入来忽略这些错误。