#include <stdio.h>
int main(void)
{
float c =8/5;
printf("The Result: %f", c);
return 0;
}
答案是1.000000
。爲什麼不是1.600000
?爲什麼我的浮球會被截斷?
#include <stdio.h>
int main(void)
{
float c =8/5;
printf("The Result: %f", c);
return 0;
}
答案是1.000000
。爲什麼不是1.600000
?爲什麼我的浮球會被截斷?
C正在將您的8/5
輸入解釋爲整數。用整數,C將其截短爲1.
將代碼更改爲8.0/5.0
。這樣它就知道你正在處理實際的數字,它會存儲你正在尋找的結果。
只是爲了澄清:編譯器**必須**將表達式「解釋」爲整數,因爲常量是整數。更確切地說,他們有'int'類型。 – Olaf
表達
8/5
是全int
表達。因此,它的計算結果爲(int)1
自動轉換爲float
發生在賦值中。
如果轉換的鴻溝面前飄起,你會得到你所尋求的答案:
(float)8/5
或只是
8.0/5
當你沒有指定你用什麼數據類型(例如,在您的代碼中,您使用整數常量8
和5
)C使用最小的合理類型。在你的情況下,它分配了整數類型8
和5
,並且因爲除法表達式的兩個操作數都是整數,所以C產生了一個整數結果。整數沒有小數點或小數部分,所以C會截斷結果。這會拋棄剩下的除法操作,留下1而不是1.6。
即使您將結果存儲在浮點型中,也會發生這種情況。這是因爲表達式是使用整數類型來計算的,所以結果按原樣存儲。
有解決這一問題的至少兩種方法:
角色表達式的一部分爲雙型或其它類型的能夠存儲小數部分:
這裏8
澆鑄到double
類型,所以C將用操作數進行浮點除法。請注意,如果您投了(8/5)
,則會在投射前進行整數除法。
foo = (double) 8/5
使用雙作爲一個操作數:
foo = 8.0/5
C不做底板劃分;在C99之前,它要麼是平面的,要麼是向零截斷,在C99中定義了實現,然後它嚴格截斷爲零,而不是平面。對於積極的結果它是一樣的(都向下舍入),但是對於負面結果,分區舍入向下舍入,向零舍入。 – ShadowRanger
@ShadowRanger很高興知道,我將編輯它。 – brandaemon
在第一個例子中說你正在投射表達式,這有點令人誤解。演員操作員優先於分區,所以你實際上將8投入浮動。如果你寫了'(float)(8/5)',你仍然會得到1. – zneak
有沒有涉及類型轉換。改變標題是一個好主意。 – Olaf
@ShadowRanger:我不同意;雖然這個問題被嚴重研究,但它不是關於整數和舍入浮點除法之間的區別,而是爲什麼整數除法不會產生浮點結果。 – Olaf
儘管標題現在好一些,但你似乎已經錯過了'8/5'這個點不是**浮點數(表格),而是一個整數。沒有一個操作數是浮點值。 – Olaf