2010-11-12 24 views
14

我有這樣的:C#簡單的除法問題

double result = 60/23; 

在我的程序,結果是2,但正確的是2,608695652173913。問題在哪裏?

回答

19

您可以使用下列任一都將給予2.60869565217391

double result = 60/23d; 
double result = 60d/23; 
double result = 60d/ 23d; 
double result = 60.0/23.0; 

double result = 60/23; //give 2 

說明:

如果任何數量爲雙它會給出一個雙


編輯:

文檔

根據下列規則進行的表達的評價:

  • 如果其中之一浮點類型是double的,表達式的計算結果是double(或者在關係表達式或布爾表達式中爲bool)。

  • 如果表達式中沒有double類型,則評估爲float(或關於關係或布爾表達式的bool)。

51

60和23的整數文字,所以你在做整數除法,然後分配給雙。整數除法的結果是2

嘗試

double result = 60.0/23.0; 

或等價

double result = 60d/23d; 

凡d後綴通知你的意思是寫一個雙重文字的編譯器。

+4

我認爲這應該被標記爲答案,因爲標記爲答案的補全複製了此.. – Nick 2010-11-12 12:39:05

+0

@尼克,我沒有複製它,如果你認爲我更新它 – 2010-11-12 16:11:20

9

它將工作

double result = (double)60/(double) 23; 

或等價

double result = (double)60/23; 
+4

儘管編譯器會優化它,代碼產生的行爲:取整數60,然後將其轉換爲double。取整數23,然後將其轉換爲double。劃分兩個劇組的結果。首先使用double值會更好(如James Gaunt的答案) – dbemerlin 2010-11-12 08:49:14

+0

是的,您是對的+1 – 2010-11-12 08:51:12

+0

但是,如果您不是處理固定數字,而是使用整數變量,這只是(?)方法。 – Jens 2010-11-12 08:56:09

3

(雙)二十三分之六十零

+0

Nop,這不行。 – Simon 2010-11-12 08:50:32

+3

它實際上會 - 類型cast(double)的優先級高於divide,並且double除以int將導致double。但60.0/23.0更清晰,因此是更好的答案。 – Mania 2010-11-12 08:54:11

+0

我明白了,對不起,我想念它。是的,它的工作... – Simon 2010-11-12 08:57:45

3

沒有使用C#了一段時間,但你將兩個整數,這據我記得,結果也是一個整數。

你可以強迫你的電話號碼文字是通過添加字母 「d」 雙打,喜歡你的:

double result = 60d/23d; 
+0

好的,這個工程。但如何做到這一點,如果我有這個:double result = 60d /someList.Count; – Simon 2010-11-12 08:52:58

+0

對另一個操作數使用Convert函數。例如:Convert.ToDouble(someList.Count) – 2010-11-12 08:57:11

+0

double result = 60d /System.Convert.ToDouble(someList.Count); – 2010-11-12 08:59:50

3

雙重結果= 60.0/23.0;

2

這是最好的做法是正確的裝點他們的相應類型的數字。這樣不僅可以避免您遇到的錯誤,還可以使代碼更具可讀性和可維護性。

double x = 100d; 
single x = 100f; 
decimal x = 100m; 
0

添加到迄今爲止所說的內容... 60/23是對兩個常量的操作。編譯器將結果識別爲常量並預先計算答案。由於該操作在兩個整數上,因此編譯器使用整數結果60/23的整數運算結果爲2;所以編譯器有效創建下列代碼:

double result = 2; 

正如已經指出的那樣已經,你需要告訴編譯器不使用整數,改變一個或兩個操作數,以非整數的將獲得編譯器使用浮點常量。

1

將紅利和除數轉換爲雙倍數值,因此結果是雙倍數值
double res = 60d/23d;

+1

已經給出和接受的答案有什麼區別? – Oliver 2012-07-18 11:01:34