2014-06-30 67 views
0

需要下列帮助。我下面的值是越来越截断如下:自动截断浮点值

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 

它看起来像一个浮点值属性,如果我们使用双重价值将得到修复。

尽管JVM版本看起来相同,但它在不同的系统中是不同的。所以我需要找到一个解释是什么基础上的四舍五入正在发生。在一个例子中,它增加了数字(12.123457),并且一次递减(48.123455)。所以你能帮我理解这种模糊性的原因以及不同系统的结果会改变什么性质。

+0

在浮点变量中存储这样的精确值会导致精度损失! –

+0

可能重复的[为什么我的float被截断?](http://stackoverflow.com/questions/9083905/why-is-my-float-being-truncated) – Smutje

回答

1

这是因为数字是如何漂浮在计算机内存中表示。这里的浮动数字是如何存储在存储器(二进制表示)的在线演示

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

根据IEEE 754标准,单精度数被存储在一个符号位,8个指数组成的32位字比特和23个尾数比特。如果按照如何表示数字48.12345678的步骤,则会发现存在下溢,并且由于它超过了23个尾数位,所以会发生截短

例如,在上面的链接中,尝试插入:48.12345678中的Decimal Representation ,然后按回车。你会看到数字将被转换为48.123455,在它上面你会发现二进制数字的单精度表示。

1

要开始您的问题,舍入显然是系统特定的,因为CPU会按照自己的方式表示浮点数据。

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

由于号被存储在系统中的二进制文件,SO The binary representation of the numbers may not be exact.

这是不寻常的特定浮点或双精度 数字作为期望不能准确地表示。由于CPU代表浮点数据,浮点数 通常没有精确的二进制表示 。出于这个原因, 您可能会遇到的精度损失,以及一些浮点 操作可能会产生意想不到的结果

+0

感谢您的解释。 – saptarshi