2014-01-27 71 views
0

我有一個功能,我需要通過double。要調用函數,我使用下面的代碼: -爲什麼C#將double轉換爲int?

static int Main() 
{ 
    double d = 1/7 ; 
    Console.WriteLine("The value of d is {0}", d) ; 
    calc(d) ; 
    return 0 ; 
} 

以下程序的輸出是

d的值是0

爲什麼會這樣,爲什麼C#將十進制前的部分截斷,儘管將1/7存儲在一個double中?

+3

改爲'double d = 1.0/7.0;' – Sinatr

回答

11

一個int除以int使用整數截斷。

使用:

static int Main() 
{ 
    double d = 1.0/7 ; 
      //^^ or d = 1.0/7.0 
    Console.WriteLine("The value of d is {0}", d) ; 
    calc(d) ; 
    return 0 ; 
} 

促進或者分子或分母(或兩者)的浮點型促進了分割到一個浮點型的結果。

參考文獻:

1

因爲在1/7的第一個參數是一個整數,所以C#做一個整數除法。

double d = (double)1/7; 
0

如果您指定的號碼作爲1沒有小數點,假設一個int類型:

如果你輸入你會得到正確的結果。替換行

double d = 1/7 ; 

double d = 1.0/7 ; 

另外,您可以使用後綴類型指定爲double

double d = 1d/7 ; 
0

在C#和Java(和大多數編程語言)的類型結果是分子和分母的類型。如果你想要結果是雙倍的,你必須將構成分子和分母的整數轉換成雙精度。

嘗試double d = 1d/7ddouble d = (double)(1/7)

+1

這個'(double)(1/7)'仍然使用整數除法。 – Henrik

+0

對不起,您必須將每個整數轉換爲雙精度,即「double d = 1d/7d」或「double d =(double)1 /(double)7」 – janderson

1

你在這裏有什麼操作的優先級。 實際上你寫

int temp = 1/7; 
double d = temp; 

裏面居然被編譯到

int temp = 0; 
double d = temp; 

double d = 0; 

其原因是是,你正在使用的INT除法運算器

static operator int/(int, int) 

當你想用的

static operator double /(double, double) 

您可以強制通過寫

double d = 1.0/7; 

OR

double d = 1d/7d; 

等等等等

4

因爲你做的是這裏所說的integer division。它總是捨棄小數部分。這就是爲什麼1/7總是給你0作爲結果無論你分配它的類型。

.NET有3種類型的劃分。 From 7.7.2 Division operator

  • 整數除法
  • 浮點除法
  • 小數除法

而且從/ Operator (C# Reference)

當你把兩個整數,結果總是整數 。例如,對於 示例,7/3的結果爲2.要獲得商數作爲合理的 數字或分數,請給出除數或除數類型float或鍵入 double。

因此,如果您需要小數部分,您可以使用其中之一;

double d = 1.0/7 ; 
double d = 1/7.0 ; 
double d = 1.0/7.0 ; 
2

According to C# reference

對於x/y形式的操作,二元運算符重載 分辨率(第7.2.4節)被施加到選擇特定的運算 實現。操作數被轉換爲所選操作符的參數類型 ,結果的類型是操作符的返回類型 。

這意味着操作員/選擇正確的過載查看其參數。在你的情況下,你的參數是整數,所以操作符選擇返回一個整數的整數除法(截去餘數)

爲了避免這種情況並選擇浮點除法,你應該給出一個提示,強迫你的一個常量是double/float

double d = 1.0/7 ; 
1

C#在編譯時是靜態類型的。您的代碼(double d = 1/7;)在運行時按以下方式運行。

var temp = 1/7; 
double d = temp; 

這裏,1和7是整數。所以,除法操作只返回整數並將其存儲在臨時位置。之後,創建變量d並將臨時值存儲在該變量中。所以,這裏的隱式類型轉換將不起作用。

所以,你必須在劃分時完成明確的類型轉換。 1.0/7或1/7.0或(雙)1/7或1 /(雙)7將返回double值。所以,這個double隱式轉換的整數在這裏不適用,你會得到你想要的結果。