2012-01-30 56 views
5

我意識到一個十進制數只能在二進制系統中精確地存儲爲一個浮點數,但是我不明白的是在我的輸出10/7中發生了什麼7小數點。java如何存儲float v double

在我的第一次輸出測試中,我注意到在浮點數結尾的第5位(第7位)與第4位(第7位)之後是雙精度數中的2。我認爲在浮動的第7位是4,因爲在雙第8位是2

浮動1.4285715 雙1.4285714285714286

我然後用浮點格式跑到下一個輸出測試17地方。在每個中的第8個位置是不同的 - 浮點數是6,這就是爲什麼第7個位置被四捨五入爲5我假設。

浮動1.428571462631225600 雙1.428571428571428600

在第三輸出測試我試過用字符串格式的直接鑄造的,看看會發生什麼。我得到了與第二次測試相同的結果。

如果我對複雜的浮點存儲方法有個簡單的問題 - 我很抱歉。

float f = 10/7f; 
    double d = 10/7d; 

    System.out.format 
     ("Float %1s\nDouble %2s\n", f,d); 
    /* 
    * Float 1.4285715 
     Double 1.4285714285714286 
    */ 

    System.out.format 
     ("Float %1$.17f\nDouble %2$.17f\n", f,d); 
    /* 
    * Float 1.428571462631225600 
     Double 1.428571428571428600 
    */ 

    System.out.format 
     ("Float %1s\nDouble %2s\n", (double)f,d); 
    /* 
    * Float 1.4285714626312256 
     Double 1.4285714285714286 
    */ 
+6

你的問題到底是什麼? (我的帖子中沒有看到任何問號...) – maerics 2012-01-30 19:50:45

+0

這是如何加倍存儲的: - http://en.wikipedia.org/wiki/Double-precision_floating-point_format – 2013-10-08 13:50:56

回答

1

看來,當你使用一個float它使用一個默認該數字的精度爲8位數。當你指定一個精度時,它會清除它實際上使用double來計算該值。

6

在我的第一次輸出測試中,我注意到浮點數結尾的第5位(第7位)與第4位(第7位)之後是雙精度數中的2。我認爲在浮動的第7位是4,因爲在雙第8位是2

這種期望纔有意義,如果你認爲花車內部存儲在小數四捨五入到一定數量的十進制數字。但事實並非如此,浮點數內部存儲在二進制文件中,並四捨五入爲二進制數字

您的期望是基於對如何存儲浮點數的誤解。你會看到更精確的小數位的雙打,因爲這是他們有更準確的二進制位的結果。該實現根本不存儲小數形式的數字。

+0

Upvoted提供最準確的解釋,解釋爲什麼會發生這種情況。 – 2012-01-30 20:36:12