我發現的雙/雙,結果是不正確的:爲什麼`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,爲什麼?
調試:
但是:
float i = 3.3, j = 1.1;
int k = (int)(i/j);
printf("%d\n", k);
調試:
我發現的雙/雙,結果是不正確的:爲什麼`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,爲什麼?
調試:
但是:
float i = 3.3, j = 1.1;
int k = (int)(i/j);
printf("%d\n", k);
調試:
3.2999/1.10 2.99給出了一些其上轉換成整數產生輸出2
double i = 3.3, j = 1.1;
int k = i/j;
由於十進制數在存儲器表示的方式的事情,我的結果/ J實際上是2.999999 ...編譯器將所述resutl i/j
從轉換到雙int因爲k是一個int。這就是結果如下2
我認爲他知道編譯器會將它轉換爲「int」。問題是爲什麼產生的整數是2而不是3,因爲3.3/1.1 = 3。 –
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,並且有更多的資源。
正如你知道3.3
不能以二進制格式正確,同樣代表了1.1
,評估k = i/j
導致
3.2999999999999998/1.1000000000000001 < 3
分配這int
類型k
它截斷爲2
。
當然結果是2.這裏真正的問題是爲什麼你認爲它會是別的,特別是你認爲結果應該是什麼? –
這裏我們再次去... –
@HighPerformanceMark我認爲你能夠自己回答這些真正的問題:)。 – Kos