class Test
{
public static void main(String[] arg2)
{
float num = 1234.123126f;
System.out.println(num);
}
}
输出:1234.1232 为什么不是1234.123或1234.1231?
答案 0 :(得分:4)
System.out.println(float)
调用String.valueOf(float)
,调用Float.toString(float)
。
答案在Float.toString(float)
的文档中:
m
或a
的小数部分必须打印多少位数?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来。
因此,它打印1234.1232
,因为它是float
数据类型可表示的最接近的值,可以从任何相邻的float
值中唯一标识。
答案 1 :(得分:0)
我明白你的观点。你的舍入逻辑是正确的。但是,由于您使用的是float
数据类型,因此会丢失一定的精度。因此,当JVM进行舍入时,它将达到值1234.1232。
答案 2 :(得分:0)
这是因为精确值的四舍五入。如果要按原样打印确切的值,则必须使用此Oracle tutorial中给出的示例指定格式。
答案 3 :(得分:0)
首先,a float can only reliably store up to 6 digits; 1234.123126太长,无法作为浮点存储并完全恢复为小数。
Java打印一个十进制字符串,允许您恢复内部浮点值。在最坏的情况下,需要9个十进制数字,但少就足够了。内部浮动值1234.123126是1234.1231689453125。圆形到9位数,即1234.12317。但是1234.1232转换为相同的浮点数,并且更短,因此Java选择了它。 (请注意,1234.123和1234.1231是不正确的选择,因为它们convert to是一个不同的浮点数:1234.123046875。