#include
#include
int main(void)
{
float num1=30000.1f;
float num2=0.0004f;
printf(\"%f\\n\",num1+num2);
system(\"pause\");
return 0;
}
在上面的程式碼中,我知道因為數字精度的問題,只有小數點後兩位是精準的,而造成答案有誤差,不是正確的30000.1004
我的問題是:為什麼執行的結果是30000.100009
2006-07-16 15:51:19 · 1 個解答 · 發問者 ? 2 in 電腦與網際網路 ➔ 程式設計
那可以再請問一下為什麼30000.1會變成30000.099609嗎?
感謝您!
2006-07-16 17:38:13 · update #1
30000.1 存在 float 時,已變成 30000.099609
0.00040 存在 float 時,仍然是 0.0004
加起來之後是 30000.100009
2006-07-17 06:38:16 補充:
10進位(的小數)是不能 100% 轉換成 2 進位的。如 0.5 => 0.1, 0.25 => 0.01,這些沒問題。但 十進位的 0.1,把它用 1/2, 1/4, 1/8, 1/16, 1/32 ... 分解起來是0.1 = 0.0625 + 0.03125 + 0.00390625 + 0.001953125 + 0.000244140625 + 0.0001220703125 + 0.0000152587890625 + 0.0000091552734375(最後這個不是 1/(2的乘羃))
2006-07-17 06:39:26 補充:
轉成 2 進位變成=> 0.0001 + 0.00001 + 0.00000001 + 0.000000001 + 0.000000000001 + 0.0000000000001 + 0.0000000000000001 + 0.0000091552734375(10)= 0.0001100110011001(2) + 0.0000091552734375(10)10進位有限小數,在 2進位變成了無限小數了!這就是原因!懂了嗎?
2006-07-16 16:51:38 · answer #1 · answered by ? 7 · 0⤊ 0⤋