在 Java 中为什么数字运算的结果与变量运算不同

pet*_*ton 3 java

我有以下代码:

System.out.println("(int) (10 * 0.75 / 0.6 + 0.5)=" + (int) (10 * 0.75 / 0.6 + 0.5));
Run Code Online (Sandbox Code Playgroud)

打印出来的是:(10 * 0.75 / 0.6 + 0.5)= 13

还有一个:

int a = 10;
float b = 0.75f;
float c = 0.6f;
System.out.println("(int) (a * b / c + 0.5)=" + (int) (a * b / c + 0.5));
Run Code Online (Sandbox Code Playgroud)

打印出来的是 (a * b / c + 0.5)= 12

为什么它们不同?

编辑:

System.out.println("(int) (10 * 0.75f / 0.6f + 0.5f)=" + (int) (10 * 0.75f / 0.6f + 0.5f));

现在打印出来的是 12: (int) (10 * 0.75f / 0.6f + 0.5f)= 12

kni*_*ttl 8

您的变量被分配了float0.75f0.6f,您的内联表达式使用double0.750.6

如果您对值使用相同的类型,您将获得相同的结果,因此无论0.…f是在内联表达式中还是将变量设为双值。

双精度数可以存储 64 位(1 个符号位、11 位指数和 53 位有效数)的精度,浮点数或单精度数只能存储 32 位(1 个符号位、8 位指数和 24 位有效数)。结果的差异由舍入误差解释。

在 Wikipedia 上阅读有关浮点数如何存储在计算机中的信息:

双精度二进制浮点数是 PC 上常用的格式,因为它比单精度浮点数范围更广,尽管它的性能和带宽成本较高。与单精度浮点格式一样,与相同大小的整数格式相比,它在整数上缺乏精度。它通常被简单地称为双倍。IEEE 754 标准将 binary64 指定为具有:

Sign bit: 1 bit
Exponent: 11 bits
Significand precision: 53 bits (52 explicitly stored)
Run Code Online (Sandbox Code Playgroud)

符号位决定了数字的符号(包括当这个数字为零时,它是有符号的)。

指数字段可以解释为从 ?1024 到 1023(2 的补码)的 11 位有符号整数或从 0 到 2047 的 11 位无符号整数,这是 IEEE 754 binary64 定义中公认的有偏形式。如果使用无符号整数格式,则算术中使用的指数值是偏移了偏差的指数 - 对于 IEEE 754 binary64 情况,指数值 1023 表示实际零(即 2e ? 1023 为 1,e必须是 1023)。指数范围从?1022 到+1023,因为?1023(全0)和+1024(全1)的指数是为特殊数字保留的。