2013-02-22 117 views
0

我正在嘗試對整數進行一些運算。問題是,當我試圖進行除法運算以獲得雙精度結果時,結果始終爲0.00000000000000000000,儘管這對於((7 * 207)/ 6790)等顯然不是這樣。我曾嘗試對公式進行類型轉換,但我仍然得到相同的結果。C中的整數將數值向下舍入/結果爲零

我在做什麼錯,我該如何解決?

int o12 = 7, o21 = 207, numTokens = 6790; 
double e11 = ((o12 * o21)/numTokens); 
printf(".%20lf", e11); // prints 0.00000000000000000000 
+0

你能提供一個真實世界的例子如何運行這段代碼?什麼是輸入? – Andrej 2013-09-05 05:31:40

回答

3

,以下成立:

int/int = int 

的輸出不會自動轉換到非int類型。

所以輸出將在分割時被置於int

你想要做什麼是強迫任何這些情況發生:

double/int = double 
float/int = float 
int/double = double 
int/float = float 

上述涉及一種自動widening conversion - 注意,只有一個需要是一個浮點值。

您可以通過這樣做:

  • 把一個(double)(float)你的價值觀,以將它轉換爲相應類型的一個或
  • 之前更改變量中的一個或更多的doublefloat

請注意,像(double)(int/int)這樣的組合將不起作用,因爲這首先進行整數除法(它返回一個int),然後纔將結果轉化爲double(這與僅僅嘗試將其分配給double而不進行任何投射相同)。

0

如果你將((7 * 207)/ 6790)嘗試

double val = double(7*207)/double(6790); 

,因爲當你只是把它,C假定整數,所以它變爲零!

+0

這仍然導致整數除法,只有結果被轉換爲'double'。 – Archie 2013-02-22 10:27:22

+0

@Archie好的,謝謝你的提示,我糾正了我的帖子。 – 2013-02-22 10:29:56

+0

@ bash.d這種形式的轉換隻適用於C++。 – 2013-02-22 19:59:29

1

這是千真萬確的,其結果是0,或0.0如果你認爲在double這樣的表達式((7 * 207)/6790)

該表達式只有整數,所以它將被計算爲整數乘法,然後是整數除法。

您需要將其轉換爲浮點類型以更改該屬性,例如, ((7 * 207)/6790.0)

很多啊似乎期望賦值的右側是自動由目標變量的類型「調整」:這是不是它是如何工作的。 結果已轉換,但不影響右側表達式中的任何「內部」操作。在代碼:

e11 = ((o12 * o21)/numTokens); 

所有o12o21numTokens是整數,使得表達爲整數求值,然後被轉換成浮點因爲e11double

這樣做

const double a_quarter = 1/4; 

這僅僅是一個相同的問題的簡單的情況:該表達式的計算第一,則結果(整數0)轉換爲加倍並存儲。這就是語言的工作原理。

解決方法是投:

e11 = ((o12 * o21)/(double) numTokens); 
+0

我明白了。謝謝!我以前在錯誤的地方投了。 – user2052561 2013-02-22 10:31:41

0

您必須分裂之前投這些數字來double。當您在int上進行除法運算時,結果也是一個舍入爲零的整數,例如1/2 == 0,但是1.0/2.0 == 0.5

0

如果操作數是整數,C將執行整數運算。那就是,1/4 == 0。但是,如果強制操作數爲double,則算術會考慮小數部分。所以說:不管實際值

int a = 1; 
int b = 4; 
double c = 1.0 

double d = a/b;   // d == 0.0 
double e = c/b;   // e == 0.25 
double f = (double)a/b; // f == 0.25 
相關問題