3 回答
TA贡献1811条经验 获得超6个赞
我发现转换为二进制表示更容易理解这个问题。
float f = 0.27f;
double d2 = (double) f;
double d3 = 0.27d;
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(f)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d2)));
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d3)));
您可以通过向末尾添加0来看到float扩展为double,但是0.27的双重表示“更准确”,因此问题。
111110100010100011110101110001
11111111010001010001111010111000100000000000000000000000000000
11111111010001010001111010111000010100011110101110000101001000
TA贡献1817条经验 获得超6个赞
这是由于合同Float.toString(float)
,部分说:
小数部分必须打印多少位数[...]?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个, 更多的数字才能唯一地将参数值与float类型的相邻值区分开来。也就是说,假设x是由此方法为有限非零参数f生成的十进制表示所表示的精确数学值。那么f必须是最接近x的浮点值; 或者,如果两个浮点值等于x,则f必须是其中之一,f的有效位的最低有效位必须为0。
添加回答
举报