簡體   English   中英

為什么我不能將雙精度隱式轉換為整數?

[英]Why can't I implicitly convert a double to an int?

您可以將 int 隱式轉換為 double: double x = 5;

您可以顯式地將 int 轉換為 double: double x = (double) 5;

您可以顯式地將 double 轉換為 int: int x = (int) 5.0;

為什么不能將雙精度隱式轉換為整數? : int x = 5.0;

double的范圍比int寬。 這就是為什么你需要顯式轉換。 由於同樣的原因,您不能隱式地從longint

long l = 234;
int x = l; // error

隱式轉換僅在您保證不會因轉換而丟失數據時才可用。 因此,您可以將integer轉換為double ,或將integer轉換為long數據類型。 但是,從double轉換為integer冒丟失數據的風險。

Console.WriteLine ((int)5.5);  
// Output > 5

這就是微軟沒有為這個特定轉換編寫隱式轉換的原因。 相反,.NET 框架強制您使用顯式轉換,以確保您通過從一種類型顯式轉換為另一種類型來做出明智的決定。

隱式關鍵字用於聲明隱式用戶定義的類型轉換運算符。 如果保證轉換不會導致數據丟失使用它來啟用用戶定義類型和另一種類型之間的隱式轉換

來源> MSDN

C# 遵循 Java 的類型系統,它對類型int -> long -> float -> double ,並指定出現在另一個類型左側的任何類型都可以強制轉換為它。 我個人認為以這種方式對類型進行排序是一個壞主意,因為這意味着像long l = getSomeValue(); float f=l; double d=f;這樣的代碼long l = getSomeValue(); float f=l; double d=f; long l = getSomeValue(); float f=l; double d=f; 盡管與將l直接存儲到d相比精度損失嚴重,但仍會干凈利落地編譯; 它還有其他一些不幸的后果。

我懷疑 Gosling 像他那樣對類型進行排序,以確保將floatdouble傳遞給為(float,float)(double,double)重載的方法將使用后者。 不幸的是,他的排名有一個不幸的副作用,即將intlong傳遞給僅對floatdouble重載的方法將導致該方法使用float重載而不是double重載。

C# 和 .NET 遵循 Java 的領先優勢,優先采用long to- float轉換而不是long to- double 將它們從一些隨之而來的方法重載恐怖中“拯救”出來的一件事是,幾乎所有具有floatdouble重載的 .NET Framework 方法也有Decimal的重載,並且在Decimal和另一個浮點數之間不存在隱式轉換- 點類型。 因此,嘗試將long傳遞給具有floatdoubleDecimal重載但不是long將導致編譯錯誤,而不是轉換為float

順便說一句,即使選擇允許哪些隱式轉換的人更仔細地考慮了這個問題,也不太可能允許從浮點類型(例如double )到離散類型(例如int )的隱式轉換。 除其他外,產生 2.9999999999994 的計算結果的最佳整數表示在某些情況下為 2,在其他情況下為 3。在有時需要以一種方式進行轉換有時需要以另一種方式進行轉換的情況下,語言要求程序員表明實際意圖通常是好的。

想象一下,你有這樣一段代碼:

double x = pi/6;
double y = sin(x);

y 將是 0.5。 現在假設 x 被轉換為整數,如下所示:

int x = pi/6;
double y = sin(x);

在這種情況下,x 將被截斷為 0,然后將采用 sin(0),即 y = 0。

這就是為什么很多強類型語言沒有實現從 double 到 int 的隱式轉換的主要原因。

int 到 double 的轉換實際上增加了類型中的信息量,因此總是可以安全地完成。

當您隱式地從 DOUBLE 轉換為 INT 時,您正在嘗試存儲一個 no。 將大內存轉換為具有小內存的變量(向下轉換)

雙d=4.5;

int x=d;//錯誤或警告

這可能很危險,因為您可能會丟失信息,就像在將其存儲為整數時可能會丟失 double 的小數部分一樣

而將 int 值存儲在雙變量(向上轉換)中時情況並非如此。

整數 x=2;

雙 d=x; //正確的

因此編譯器不允許從 double 隱式轉換為 int(或將 double 值存儲在 int 中),因為有人可能會在不知不覺中這樣做並且期望不會丟失數據。 但是,如果您明確強制轉換,則意味着您對編譯器說,無論危險如何,我都會處理....希望它有所幫助..

暫無
暫無

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

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