簡體   English   中英

為什么C#將double轉換為int?

[英]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卻截斷了十進制前的部分?

一個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 / 7總是給您0的結果, 而不管您為它分配哪種類型。

.NET有3種划分方式。 From 7.7.2 Division operator

  • 整數除法
  • 浮點除法
  • 十進制除法

也來自/ Operator (C# Reference)

當您將兩個整數相除時,結果始終是一個integer 例如,7/3的結果為2。要獲得有理數或分數的商,請給定float或divisor類型為double或double類型。

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

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

根據C#參考

對於形式為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/7ddouble d = (double)(1/7)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM