[英]Why is C# casting double to int?
我有一個函數需要傳遞一個double
。 要調用該函數,我使用以下代碼:-
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卻截斷了十進制前的部分?
因為您在這里所做的就是整數除法 。 它總是丟棄小數部分。 這就是為什么1 / 7
總是給您0
的結果, 而不管您為它分配哪種類型。
.NET有3種划分方式。 From 7.7.2 Division operator
當您將兩個整數相除時,結果始終是一個integer 。 例如,7/3的結果為2。要獲得有理數或分數的商,請給定float或divisor類型為double或double類型。
因此,因此,如果需要小數部分,則可以使用其中之一;
double d = 1.0 / 7 ;
double d = 1 / 7.0 ;
double d = 1.0 / 7.0 ;
對於形式為x / y的運算,將使用二進制運算符重載解析(第7.2.4節)來選擇特定的運算符實現。 操作數將轉換為所選運算符的參數類型,結果的類型為運算符的返回類型。
這意味着操作員/會根據其參數選擇正確的過載。 在您的情況下,您的參數是整數,因此,運算符選擇返回整數的整數除法(將余數截短)
為了避免這種情況,並選擇浮點除法,您應該給出一個提示,將一個常量強制為double / float
double d = 1.0 / 7 ;
由於1/7中的第一個參數是整數,因此c#進行整數除法。
如果鍵入以下內容,則將獲得正確的結果:
double d = (double)1/7;
您在這里擁有的是操作優先級。 實際上你已經寫了
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;
要么
double d = 1d / 7d;
等
C#在編譯時是靜態類型的。 您的代碼(double d = 1/7;)在運行時按以下方式運行。
var temp = 1/7;
double d = temp;
在此,1和7是整數。 因此,除法運算僅返回整數並將其存儲在臨時位置。 之后,創建變量d,並將臨時值存儲在該變量中。 因此,此處的隱式類型轉換將不起作用。
因此,您必須在分割時進行顯式類型轉換。 1.0 / 7或1 / 7.0或(double)1/7或1 /(double)7將返回double值。 因此,將雙精度隱式強制轉換的整數不適用於此處,您將獲得所需的結果。
如果將數字指定為1
不帶小數點),則假定為int
類型。 更換線
double d = 1/7 ;
與
double d = 1.0/7 ;
或者,您可以使用后綴將類型指定為double
:
double d = 1d/7 ;
在C#和Java(以及大多數編程語言)中,結果的類型是分子和分母的類型。 如果要使結果為雙精度數,則必須將組成分子和分母的整數轉換為雙精度數。
嘗試double d = 1d/7d
或double d = (double)(1/7)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.