我有以下代码:
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
您的变量被分配了float值0.75f和0.6f,您的内联表达式使用double值0.75和0.6。
如果您对值使用相同的类型,您将获得相同的结果,因此无论0.…f是在内联表达式中还是将变量设为双值。
双精度数可以存储 64 位(1 个符号位、11 位指数和 53 位有效数)的精度,浮点数或单精度数只能存储 32 位(1 个符号位、8 位指数和 24 位有效数)。结果的差异由舍入误差解释。
在 Wikipedia 上阅读有关浮点数如何存储在计算机中的信息:
双精度二进制浮点数是 PC 上常用的格式,因为它比单精度浮点数范围更广,尽管它的性能和带宽成本较高。与单精度浮点格式一样,与相同大小的整数格式相比,它在整数上缺乏精度。它通常被简单地称为双倍。IEEE 754 标准将 binary64 指定为具有:
Run Code Online (Sandbox Code Playgroud)Sign bit: 1 bit Exponent: 11 bits Significand precision: 53 bits (52 explicitly stored)符号位决定了数字的符号(包括当这个数字为零时,它是有符号的)。
指数字段可以解释为从 ?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)的指数是为特殊数字保留的。