[英]Java : double to float type conversion is giving 'infinity' for larger values
假設我有一個帶有一些隨機較大值double類型的變量:
double d = 4786777867867868654674678346734763478673478654478967.77;
現在,如果我嘗試在程序中的某個點將其轉換為float,則輸出顯示“infinity”(在eclipse IDE中):
float f = (float)d; // inifinty
byte b = (byte)d; // some valid value
short s = (short)d; // some valid value
int i = (int)d; // some valid value
有人可以給我任何有效的答案,它是如何不僅僅為float數據類型轉換?
讓我們看看將這個大型double
為每個其他數字基元類型的結果:
double d = 4786777867867868654674678346734763478673478654478967.77;
System.out.printf("float %f\n", (float)d);
System.out.printf("long %d\n", (long)d);
System.out.printf("int %d\n", (int)d);
System.out.printf("short %d\n", (short)d);
System.out.printf("byte %d\n", (byte)d);
輸出:
float Infinity
long 9223372036854775807
int 2147483647
short -1
byte -1
浮動
來自JLS :
從double到float的縮小基元轉換由IEEE 754舍入規則(第4.2.4節)控制。 這種轉換可能會失去精度,但也會失去范圍,導致從非零雙精度浮點零和從有限雙精度浮點無窮大 。
基本上,IEEE 754強制要求這種行為。 IEEE 754預留了一個特定的位模式來表示無窮大,並且定義了涉及該值的所有浮點運算。
Long&Int
JLS指出,在從double
到long
或int
原始轉換變窄的情況下,如果值太大Long.MAX_VALUE
適合該范圍(64或32位有符號整數),則應使用最大的可表示值Long.MAX_VALUE
和Integer.MAX_VALUE
;
短和字節
在將double
轉換為short
或byte
,首先使用上面的規則將數字強制轉換為int
。 然后通過丟棄除n
最低位之外的所有位( short
為16,對於byte
為8),將其從int
為short
或byte
。 由於除Integer.MAX_VALUE
的高位之外的所有位都設置為1,因此short
值和byte
值都設置了所有位,對應於帶符號二進制補碼中的-1。
浮動范圍從1.40129846432481707e-45到3.40282346638528860e + 38。
雙值不適合它。 Java規范還說:
這種轉換可能會失去精度,但也會失去范圍,導致從非零雙精度浮點零和從有限雙精度浮點無窮大。
Double是64位,float是32位。 並非所有雙打都適合漂浮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.