簡體   English   中英

Java:d​​ouble to float類型轉換為更大的值賦予'infinity'

[英]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指出,在從doublelongint原始轉換變窄的情況下,如果值太大Long.MAX_VALUE適合該范圍(64或32位有符號整數),則應使用最大的可表示值Long.MAX_VALUEInteger.MAX_VALUE ;

短和字節

在將double轉換為shortbyte ,首先使用上面的規則將數字強制轉換為int 然后通過丟棄除n最低位之外的所有位( short為16,對於byte為8),將其從intshortbyte 由於除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.

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