2012-02-29 36 views
2

我從來沒有真正使用過漂浮物,並且我正在處理的當前項目需要它們。我收到了幾年前我瞭解到的奇怪問題,但卻忘記了爲什麼會發生這種情況。爲什麼我的浮點值失去精度並丟失小數?下面的示例代碼

我的結果乘法或增加浮動後不是他們應該是。

這裏是我的代碼:

void main() 
{ 
    //Example 1 - ERROR 
    float a=16937.6; 
    float b=112918; 
    float total=b+a; 
    cout<<total<<endl; //Outputs 129896 - rounds up and loses decimal (129855.6) 

    //Example 2 - Error 
    float c=247.82; 
    float d=9995.2; 
    float total2=c+d; 
    cout<<total2<<endl; //Outputs 10243 - loses all decimals (10243.02) 
    system ("pause"); 

} 
+1

http://en.wikipedia.org/wiki/Floating_point準確性問題的部分是你在找什麼。 – Almo 2012-02-29 21:22:45

+1

不,我認爲在這種情況下輸出不正確 – user1147223 2012-02-29 21:33:37

回答

7

您的問題不是小數精度 - 它是用於輸出值的格式。

嘗試:

cout << setiosflags(ios::fixed) << setprecision(2) << x; 
+2

+1:是的,在這種情況下,這是正確的答案。 – 2012-02-29 21:29:09

+0

這工作很好!我試圖使用其他形式的數字,但有相同的結果(雙打等)。無法弄清楚。 謝謝! – CREW 2012-02-29 21:32:39

+0

不,如果在任何時候您處理的數字超過6位,使用'float'並不是正確答案,但是您強制輸出函數。 – Amadan 2012-02-29 21:41:36

4
+4

嚴重的是,同樣的精度問題不斷出現。答案總是一樣的。它應該進入FAQ。 – Anycorn 2012-02-29 21:23:38

+3

我認爲這是關於輸出格式,而不是小數精度。 – 2012-02-29 21:26:28

+0

@DStanley:我認爲它是連接的。輸出舍入存在,所以你不會得到像'0.1 + 0.2 = 0.30000000000000004'這樣的東西。對於第一個例子,32位算術運算的結果約爲'129855.6015625',輸出函數知道只有6位數是確定的,所以它選擇舍入結果。您可以通過設置輸出精度獲得更多數字,但您不知道它們是否正確。 – Amadan 2012-02-29 21:36:35