2013-05-28 51 views
0

C程序float f = 123.456;爲什麼內存中的f是「123.456001」。C程序float f = 123.456;爲什麼內存中的f是「123.456001」

#include<stdio.h> 
main() 
{ 
    float f = 123.456; 
    printf("%f**%10.2f**%.3f\n", f, f, f); 
    printf("%f**%e**%g**\n", f, f, f); 
} 

123.456001

爲什麼0.000001?

+12

http://floating-point-gui.de/ –

+1

它甚至不是123.456001,但有在'1'之後會有更多的小數。 –

+3

[每個計算機科學家都應該知道的浮點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – glglgl

回答

4

123.456 

的二進制展開是

1111011.0111010010111100011010100111111011111001110111... 

計算機輪這一關到

1111011.01110100101111001 

這是實際存儲在存儲器中的號碼。

這個號碼的十進制擴展是

123.45600128173828125... 

將其印刷四捨五入到

123.456001 
+0

我知道,但我無法理解。我知道A \ D或D \ A;我不明白爲什麼在C程序中是0.000001。 – kangear

+0

@ kangear:看到我修改後的答案。 – user763305

+0

非常感謝!我明白。 – kangear

1

並不是每個數字都可以完全由計算機來表示,這就需要無限的內存。所以浮點數四捨五入到最接近的可表示數字。