簡體   English   中英

為什么需要從 double 到 float 而不是從 int 到 byte 的顯式類型轉換?

[英]why explicit type casting required from double to float but not from int to byte?

考慮以下語句:

byte by = 5; //works fine

文字 '5' 是 int 類型並且足夠小以適合字節類型的變量。 編譯器在這里進行隱式類型轉換(從 int 到 byte)。

現在考慮以下場景:

float fl = 5.5;    //compilation error

文字 '5.5' 是 double 類型,也小到足以放入 float 類型的變量中。 為什么我們需要像這樣顯式類型轉換:

float fl = (float) 5.5;   //works fine

為什么編譯器在浮點數的情況下不為我們進行轉換?

在整數版本中,編譯器知道數字5中的所有數據都可以存儲在一個byte 不會丟失任何信息。 對於浮點值,情況並非總是如此。 例如, 0.1f不等於0.1d

現在的例子,你給,十進制值5.5恰恰在這兩個代表floatdouble ,所以你可能會說,在這種情況下,不會丟失任何信息-但是這將是很奇怪的語言規范,以有使其有效:

float f = 5.5;

但這無效:

float f = 5.6;

語言規范很樂意討論一個數字是否在float / double的范圍內(盡管並不像你想象的那么簡單)但是當談到是否可以精確表示文字時,我不認為它曾經進入細節。

簡單的答案是,因為規范是這樣說的(整數類型的編譯時常量可以分配給較小的類型,只要它們適合)。

然而,對於浮點,並沒有太多確定常量是否合適,而是隨之而來的精度損失。 例如,將 1.23456789123 分配給 double 很好,但分配給 float 就不行。 但是,在這種情況下,至少對某些程序員而言,原因並不那么明顯。 某些浮點常量有效而其他浮點常量無效時,我肯定會將其視為一個驚喜,並且原因不像整數類型那樣清楚(其中限制通常是大多數人的第二天性)。

請注意,即使是雙打,有時也會丟失信息。 您可以根據需要使常量盡可能精確,但您不會總是獲得您在變量中聲明的確切值。

同意 Jon,但是,我想補充一點

byte by = 5;     //works fine until the number is less than 128 

這是因為一個字節最多只能容納 -128 到 127。一旦您嘗試輸入大於 127 的數字,您將得到與將雙精度值存儲到浮點數時相同的錯誤。

byte by =  128; //compilation error

所以為了同意轉換數據的丟失,您需要執行顯式轉換。

byte by = (byte) 128; // work fine

Java 允許將int類型的文字隱式縮小轉換為shortbyte ,但不允許將文字double值轉換為float的最重要原因可能是 Java 包含float文字,但不允許類型文字byteshort

就我個人而言,我真的不喜歡 Java 的數字轉換規則,但是允許將整數常量存儲到shortbyte使得這些類型至少在某種程度上可以忍受。

暫無
暫無

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

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