2014-04-03 45 views
-1

我的目的是圓一個值,但它給出錯誤的輸出用10除以給出錯誤的精度

 float travellingEmptyDist = 2.05; 
travellingEmptyDist = round(travellingEmptyDist * 10); // gives value 21.0 
travellingEmptyDist = travellingEmptyDist/ 10.0; // gives wrong value 2.09999, expecting 2.1 

有什麼辦法來糾正它

+5

*嘆* * http://floating-point-gui.de/ – IdeaHat

+0

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+3

有人應該至少指出儘管他的源代碼說了什麼,「travellingEmptyDist」並不是2.05。 –

回答

-3

我想你的片段。我得到2.1。不知道爲什麼你得到2.09999。我用過gcc編譯器。

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    float travellingEmptyDist = 2.05; 
    travellingEmptyDist = round(travellingEmptyDist * 10); // gives value 21.0 
    travellingEmptyDist = travellingEmptyDist/ 10.0; 

    printf("value: %f\n", travellingEmptyDist); 

    return 0; 
} 
+0

我使用diab編譯器,只有這個值的問題。其他值工作良好 – Sijith

+1

親愛的上帝,他們這些天在教你程序員什麼?浮點圓化錯誤,非常簡單的東西。 – IdeaHat

+0

很確定標準輸出庫足夠聰明,可以將2.09999轉換爲2.1。否則,所有浮點輸出(和大多數雙輸出)將非常混亂。 – JSQuareD

1

我建議觀看此視頻 Computerphile: Floating Points

它會給你爲什麼浮點本身是沒有考慮太多的技術細節不準確的一個非常簡單的概述。我也是偏見,因爲我喜歡編號。

你需要問自己,你真的需要額外的0.00001精度嗎?如果你真的需要更高的精度,使用double而不是float,但即使如此,你仍然會有舍入誤差。

如果您需要更高的精度,您將不得不使用第三方精度算術庫。我從來沒有需要一個,但GMP似乎是基於谷歌的結果流行。

+0

Double會讓你的0.00001f,但它不會讓你「真實」的percision。爲此,你需要做定點數學運算:http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math – IdeaHat

+0

這就是爲什麼我鏈接到GMP –