2014-01-24 83 views
-2

我發現的雙/雙,結果是不正確的:爲什麼`double i = 3.3,j = 1.1; int k = i/j; printf(「%d n」,k);`得到2?

double i = 3.3, j = 1.1; 
int k = i/j; 
printf("%d\n", k); 

結果是2,爲什麼?
調試:

enter image description here

但是:

float i = 3.3, j = 1.1; 
int k = (int)(i/j); 
printf("%d\n", k); 

調試:

enter image description here

+1

當然結果是2.這裏真正的問題是爲什麼你認爲它會是別的,特別是你認爲結果應該是什麼? –

+2

這裏我們再次去... –

+0

@HighPerformanceMark我認爲你能夠自己回答這些真正的問題:)。 – Kos

回答

2

3.2999/1.10 2.99給出了一些其上轉換成整數產生輸出2

0
double i = 3.3, j = 1.1; 
int k = i/j; 

由於十進制數在存儲器表示的方式的事情,我的結果/ J實際上是2.999999 ...編譯器將所述resutl i/j從轉換到雙int因爲k是一個int。這就是結果如下2

+1

我認爲他知道編譯器會將它轉換爲「int」。問題是爲什麼產生的整數是2而不是3,因爲3.3/1.1 = 3。 –

2

double不能代表3.3,即使你在代碼中寫入3.3,double也會將它存儲爲3.2999999999999998。 (它不能儲存1.1確切任一,這將是1.1000000000000001)

所以i/j正在執行3.2999999999999998/1.1000000000000001,其結果將被存儲爲2.9999999999999996

轉換雙爲int截斷值,它不圓它所以2.9999999999999996將被轉換爲2

This也適用於帶有IEEE 754浮點的C,並且有更多的資源。

0

正如你知道3.3不能以二進制格式正確,同樣代表了1.1,評估k = i/j導致

3.2999999999999998/1.1000000000000001 < 3 

分配這int類型k它截斷爲2

相關問題