自动截断浮点值

时间:2014-06-30 06:15:44

标签: java

需要以下帮助。我跟随的值被截断如下:

    float data1 = 48.12345678f;
    float data2 = 12.12345678f;
    float data3 = 90.12345678f;
    float data4 = 56.12345678f;

    System.out.println(data1);
    System.out.println(data2);
    System.out.println(data3);
    System.out.println(data4);

Output -

48.123455
12.123457
90.12346
56.123455

它看起来像一个浮点值属性,如果我们使用double值它将被修复。

即使JVM版本看起来相同,这在不同的系统中也会有所不同。所以我需要找到解释正在进行的四舍五入的基础。在一个实例中,它是递增数字(12.123457)并且在一个递减中(48.123455)。那么请你帮我理解这种模糊性的原因以及不同系统的结果会改变什么属性。

2 个答案:

答案 0 :(得分:1)

从问题开始,四舍五入显然是系统特定的,因为CPU根据自己的方式表示浮点数据。

所以在你的情况下--->在一个例子中,它是递增数字(12.123457)和一个递减(48.123455)。它发生在不同的机器或系统上。

由于数字以二进制文件形式存储在系统中,因此The binary representation of the numbers may not be exact.

  

特定浮点或双精度并不罕见   数字不能完全按照预期表示。浮点   十进制值通常没有精确的二进制表示   由于CPU如何表示浮点数据。为此原因,   您可能会遇到精度损失和一些浮点问题   操作可能会产生意外结果

答案 1 :(得分:1)

这是由于浮点数在计算机内存中的表示方式。这是一个关于浮点数如何存储在内存中的在线演示(二进制表示)

http://www.h-schmidt.net/FloatConverter/IEEE754.html

根据IEEE 754标准,单个精度数存储在由一个符号位,8个指数位和23个尾数位组成的32位字中。如果您按照如何表示数字48.12345678的步骤进行操作,您将发现存在下溢并且某些位被截断,因为它超过了23个尾数位

例如,在上面的链接中,尝试在Decimal Representation中插入:48.12345678,然后按Enter键。您将看到该数字将转换为48.123455,在其上方您将找到二进制数字的单精度表示