2014-06-30 70 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