2016-01-30 48 views
0
#include <stdio.h> 

int main(void) 
{ 
    float c =8/5; 
    printf("The Result: %f", c); 
    return 0; 
} 

答案是1.000000。爲什麼不是1.600000爲什麼我的浮球會被截斷?

+1

有沒有涉及類型轉換。改變標題是一個好主意。 – Olaf

+0

@ShadowRanger:我不同意;雖然這個問題被嚴重研究,但它不是關於整數和舍入浮點除法之間的區別,而是爲什麼整數除法不會產生浮點結果。 – Olaf

+0

儘管標題現在好一些,但你似乎已經錯過了'8/5'這個點不是**浮點數(表格),而是一個整數。沒有一個操作數是浮點值。 – Olaf

回答

2

C正在將您的8/5輸入解釋爲整數。用整數,C將其截短爲1.

將代碼更改爲8.0/5.0。這樣它就知道你正在處理實際的數字,它會存儲你正在尋找的結果。

+0

只是爲了澄清:編譯器**必須**將表達式「解釋」爲整數,因爲常量是整數。更確切地說,他們有'int'類型。 – Olaf

1

表達

8/5 

是全int表達。因此,它的計算結果爲(int)1

自動轉換爲float發生在賦值中。

如果轉換的鴻溝面前飄起,你會得到你所尋求的答案:

(float)8/5 

或只是

8.0/5 
0

當你沒有指定你用什麼數據類型(例如,在您的代碼中,您使用整數常量85)C使用最小的合理類型。在你的情況下,它分配了整數類型85,並且因爲除法表達式的兩個操作數都是整數,所以C產生了一個整數結果。整數沒有小數點或小數部分,所以C會截斷結果。這會拋棄剩下的除法操作,留下1而不是1.6。

即使您將結果存儲在浮點型中,也會發生這種情況。這是因爲表達式是使用整數類型來計算的,所以結果按原樣存儲。

有解決這一問題的至少兩種方法:

角色表達式的一部分爲雙型或其它類型的能夠存儲小數部分:

這裏8澆鑄到double類型,所以C將用操作數進行浮點除法。請注意,如果您投了(8/5),則會在投射前進行整數除法。

foo = (double) 8/5 

使用雙作爲一個操作數:

foo = 8.0/5 
+1

C不做底板劃分;在C99之前,它要麼是平面的,要麼是向零截斷,在C99中定義了實現,然後它嚴格截斷爲零,而不是平面。對於積極的結果它是一樣的(都向下舍入),但是對於負面結果,分區舍入向下舍入,向零舍入。 – ShadowRanger

+0

@ShadowRanger很高興知道,我將編輯它。 – brandaemon

+1

在第一個例子中說你正在投射表達式,這有點令人誤解。演員操作員優先於分區,所以你實際上將8投入浮動。如果你寫了'(float)(8/5)',你仍然會得到1. – zneak

相關問題