我有以下代码:

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

打印输出为:(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));

打印输出为(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

最佳答案

您的变量被分配了float0.75f0.6f,内联表达式使用了double0.750.6
如果对值使用相同的类型,则将获得相同的结果,因此,内联表达式中的0.…f或使变量成为值的两倍。
双打可以存储64位(1个符号位,11位指数和53位有效)的精度,浮点型或单打只能存储32位(1个符号位,8位指数和24位有效)。结果的差异由舍入误差解释。
在Wikipedia上阅读如何将浮点数存储在计算机中:

Double-precision二进制浮点数是PC上常用的格式,尽管它在性能和带宽成本方面都比single-precision浮点数更宽。与单精度浮点格式一样,与相同大小的整数格式相比,它在整数上缺乏精度。通常简称为double。 IEEE 754标准将binary64指定为具有:

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)的指数是保留给特殊数字的。

09-11 18:13