2016-12-25 68 views
4

我有一個奇怪的問題。下面是我的代碼部分:
1100 * 0.03 = 33:地板vs詮釋差異

int temp=1100; 
int foo=floor(0.03*temp); 
int foo1=0.03*temp; 
if(foo-foo1){ 
     cout<<foo<<endl; 
     cout<<foo1<<endl; 
} 

如果3的temp =整數%然後foofoo1由1
例如不同。
foo = 33
foo1 = 32。
另外,如果我把它寫這樣的:

int foo=floor(0.03*1100); 
int foo1=0.03*1100; 

有沒有這樣的問題。
爲什麼?

+4

Casting into'int'向下舍入爲零,而「floor()」總是向下舍入(向負無窮大) – Leon

+0

您正在使用哪種編譯器?無法在此處重現它:http://coliru.stacked-crooked.com/a/2df015f881f60122 – alain

+0

代碼塊16.01 –

回答

2

浮點數無法渲染小數位。這更像是一個近似值。

2 ** - 6 + 2 ** - 7 + 2 ** - 8 + 2 ** - 9 + 2 ** - 11 + 2 ** - 13 + 2 ** - 14 + 2 ** - 15 + 2 ** - 20 + 2 ** - 22 + 2 ** - 26 = 0.0299999863

使用二進制,我把精度推到26二進制。我接近0.03但不完全。在我的例子中,我選擇了0.03以下,但是我可以稍微高一些(即0.03000001),我認爲在浮點數表示法中不可能完美地表示0.03.

將任意數字乘以0.03會產生另一個數字我認爲floor的實現更加優雅,你的編譯器可能會選擇一個32.99999的浮點數值,int可以設置爲32.