Float - 数据类型混乱

时间:2016-09-14 04:57:26

标签: java floating-point

class Test
{
    public static void main(String[] arg2) 
    {
        float num = 1234.123126f;
        System.out.println(num);
    }
}

输出:1234.1232 为什么不是1234.123或1234.1231?

4 个答案:

答案 0 :(得分:4)

System.out.println(float)调用String.valueOf(float),调用Float.toString(float)

答案在Float.toString(float)的文档中:

  

ma的小数部分必须打印多少位数?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与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。