[英]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恰恰是在這兩個代表float
和double
,所以你可能會說,在這種情況下,不會丟失任何信息-但是這將是很奇怪的語言規范,以有使其有效:
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
類型的文字隱式縮小轉換為short
和byte
,但不允許將文字double
值轉換為float
的最重要原因可能是 Java 包含float
文字,但不允許類型文字byte
和short
。
就我個人而言,我真的不喜歡 Java 的數字轉換規則,但是允許將整數常量存儲到short
和byte
使得這些類型至少在某種程度上可以忍受。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.