2011-12-14 318 views
1
#include "stdafx.h" 
#include "stdio.h" 
#include "math.h" 

int main() 
{ 
float c; 

printf("Type c"); 

scanf("%f", &c); 


    printf("C is c: %f ",c); 

    while(getchar()!='\n'); 
    getchar(); 
    return 0; 

    } 

非常簡單的代碼,我剛開始與C 對於大多數數字工作正常,但是,例如,如果我輸入47.2然後打印我47.200001與88.4321輸出88.432098 但與其他號碼,如5.4工程確定5.400000 我使用Microsoft Visual Studio 10.scanf浮點數,打印浮點數,不同的值?

另一件事,如果上面的代碼,而不是把float c我把雙我不能夠printf我應該把什麼,而不是%f? 但它更擔心我的第一個問題,也許這是與編譯器有關,也許我正在編譯C代碼作爲C++,我不知道。

+1

%lf將打印雙打 – 2011-12-14 21:28:02

+0

`%lf`和`double` ftw – Nakilon 2012-11-28 12:37:26

回答

0

關於您的數字準確性。以二進制格式存儲浮點值時,這是一個已知問題。從PHP文檔稍微修改...

浮點數的精度有限。雖然它取決於系統,但大多數語言通常使用IEEE 754雙精度格式,由於舍入順序爲1.11e-16,因此會產生最大相對誤差。非基本的算術運算可能會導致更大的錯誤,當然,當多個運算複合時,必須考慮錯誤編程。

此外,基數10中的浮點數(如0.1或0.7)可以精確表示的有理數作爲基數2中的浮點數沒有精確的表示,在內部使用該浮點數,無論大小尾數。因此,他們不能被轉換成其內部的二進制對應,而不會有小的精度損失。這可能導致令人困惑的結果:例如,floor((0.1 + 0.7)* 10)通常會返回7而不是預期的8,因爲內部表示將類似於7.9999999999999991118 ....

因此永遠不要相信浮點數結果到最後一位,並且從不比較浮點數是否相等。

如果您需要更高的精度,您可能需要調查其唯一目的是處理高精度數字的輔助庫。