6

代码:

class Main {
    public static void main (String[] args) {
        System.out.print("float: ");
        System.out.println(1.35f-0.00026f);
        System.out.print("double: ");
        System.out.println(1.35-0.00026);
    }
}

输出:

float: 1.34974
double: 1.3497400000000002

???float 得到了正确的答案,但是 double 是从任何地方添加额外的东西,为什么?

double 不应该比 float 更精确吗?

4

3 回答 3

12

float 是 4 字节宽,而 double 是 8 字节宽。

检查每个计算机科学家应该知道的关于浮点运算的知识

当然 double 具有更高的精度,因此它的舍入误差略小。

将无限多个实数压缩为有限位数需要近似表示。尽管整数有无限多,但在大多数程序中,整数计算的结果可以存储在 32 位中。相反,给定任何固定位数,大多数实数计算将产生无法使用那么多位精确表示的量。因此,浮点计算的结果必须经常四舍五入以适应其有限表示。这种舍入误差是浮点计算的特征。

附带说明:-

我建议如果你想要确切的十进制值然后使用java.math.BigDecimal

于 2013-10-18T07:36:04.217 回答
3

如果您了解将精度值 转换为字符串的规则(由Double.toString [Java-API]的文档指定),您就会知道该程序会打印足以将双精度值与其最近邻区分开的最短小数部分, 小数点前后至少有一位数。

查看 Joshua Bloch 的Java Puzzlers: Traps, Pitfalls, and Corner Cases - Puzzle 2: Time for a Change。他在那一章解释了这个问题。

于 2013-10-18T07:52:40.637 回答
3

其原因是具有浮点计算的数字机制。此外,当 java 尝试打印浮点值时,它会截断尾随零。而且,你知道,精度型使用 8 个字节,浮点型使用 4 个。所以精度更大。

因此,当 java 计算您的浮点值时,它会得到类似 1.3497400 并在输出前截断它。当java计算你的double值时,它会得到更多的数字,所以你会得到这样的结果。

尝试执行这个简单的示例以便更好地理解:

public class Test {
    public static void main( String[] args ) {
        float sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += 0.1;
        }
        System.out.println( sum );
    }
}

public class Test {
    public static void main( String[] args ) {
        double sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += 0.1;
        }
        System.out.println( sum );
    }
}
于 2013-10-18T07:57:55.683 回答