[英]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.