簡體   English   中英

下面的 Java 類型轉換是如何工作的?

[英]How does the Below Java Type casting works?

輸出如何變成“1”?

long number = 499_999_999_000_000_001L;    
double converted = (double) number;
System.out.println(number - (long) converted);

TLDR:這是因為溢出位

如果您查看 java 文檔Double.MAX_VALUE 您將觀察到 java 支持的最大雙整數值是 2^53 ≅ 10^16 但在類型轉換后您的值變為 (4.99999999 * 10^17) 超出 double 的范圍,因此由於溢出,它被舍入。 為了更好地理解運行此代碼。

public class Main
{
    public static void main(String[] args) {
        long longNumber = 499_999_999_000_000_001L;
        double doubleNumber = (double) longNumber;
        long longConverted = (long)doubleNumber;
        System.out.println(longNumber+" "+doubleNumber+" "+longConverted);
    }
}

它的輸出將是:

499999999000000001 4.99999999E17 499999999000000000

您需要做的只是一點點“調試”。
嘗試運行此代碼...

long number = 499_999_999_000_000_001L;
System.out.println(number);
double converted = (double) number;
System.out.println(converted);
System.out.println((long) converted);
System.out.println(number - (long) converted);

這是它顯示的...

499999999000000001
4.99999999E17
499999999000000000
1

您想知道為什么從double轉換回long會降低1嗎?
如果你這樣做,我會向你推薦Java 規范

編輯

准確地說,請參閱擴展原始轉換部分

從 ... long 到 double 的擴展原始轉換可能會導致精度損失 - 也就是說,結果可能會丟失值的一些最低有效位。 在這種情況下,生成的浮點值將是整數值的正確舍入版本,使用 IEEE 754 舍入到最近模式(第 4.2.4 節)。

暫無
暫無

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

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