2014-02-21 148 views
-4

以下是讓我困惑 -混淆C++乘法運算

如果你乘float 10(integer)看看發生了什麼事,也 這些類型的操作似乎很奇怪!

#include <iostream> 
using namespace std; 

int main() 
{ 
    float x1 = 0.1;// x1 *10 = 1 ture 
    float x2 = 0.7;//x2 *10 = 7 false answer give 0.6 
    float x3 = 0.8;//x3 *10 = 8 true 
    float x4 = 0.9;// x4 * 10 = 9 false ops! the answer is 8 
    int f = x4 * 10 ; 
    cout<<f ; 

    return 0; 
} 

任何人都可以解釋一下嗎?

+0

那麼[ideone](http://ideone.com/P4cCX2)輸出'9'。 –

+1

您將返回的值存儲爲int而不是float。 – woodlumhoodlum

+0

你複製相同的代碼? –

回答

0

花車總是捨去(13.999999是13作爲int)。浮點運算受小的舍入誤差影響。試試這個:

int f = (x4 * 10) + 0.5; 

它只會使用正數,但證明如何做這種事情。

0

您對f的類型使用int,因此精度會丟失。試着用:

float f = x4 * 10.0; 

,然後再試一次。

3

因爲您試圖將結果保存到int而不是float。這將關閉浮動部分,只保留整數部分,例如(int) 6.999 = 6

如果你想獲得預期結果,你應該至少圍着它

int f = x4 * 10 + 0.5; 
       ^^^^^ 
        | +0.5 here to round it 

注:通過@JamesKanze的評論,因爲有multiple definitions of rounding+0.5可能不適用於負數(使用-0.5代替)。爲了讓您的工作更輕鬆,您還可以使用自C++11以來的std:round())。

或將其保存,因爲它應該是什麼樣的,即float

float f = x4 * 10; 
^^^^^ 

P.S:要看下去,看看What Every Computer Scientist Should Know About Floating-Point Arithmetic

+2

在C++ 11中還有一個函數'std :: round'。例如,添加'0.5'對於負數不起作用。 –

+0

@JamesKanze更新時間感謝您指出了這一點。 – herohuyongtao

-1

浮點數不能準確地表示數字。例如,考慮表達式1/3

您正在將乘積的結果賦值給整型變量。在這種情況下,浮點數被截斷,因爲它的部分被拋出。

改用

float f = x4 * 10 ; 
+2

'浮點數不能準確表示數字有很多很多數字,他們可以完全表示很好。 –

+0

@LightnessRacesinOrbit事實上,每個浮點數(除了無窮和NaNs)確實代表一個數字。問題恰恰相反:並非每個數字都可以用浮點數表示。 –

+1

@JamesKanze他就是這麼說的! –