簡體   English   中英

`(long)(float)Long.MAX_VALUE`具有確切的值,那怎么可能?

[英]`(long)(float)Long.MAX_VALUE` has the exact value, how is that possible?

LongFloat擁有更多的字節,因此我預計最高的long可能不會完全存儲在float中。 確實是這樣:

System.out.println(String.format("%d", Long.MAX_VALUE));
// 9223372036854775807
System.out.println(String.format("%.0f", (float)Long.MAX_VALUE));
// 9223372036854776000

但是,如果我將此浮點數轉換回long,那么我怎么有可能獲得原始值呢?

System.out.println(String.format("%d", (long)(float)Long.MAX_VALUE));
// 9223372036854775807

Java如何以某種方式恢復丟失的精度?

編輯1 :一些額外的信息:

float j = Long.MAX_VALUE;
System.out.println((long)j);
// 9223372036854775807

因此,即使存儲該值,效果也是一樣的。 Java是否真的忽略了“ cast”(即使已存儲)? 我覺得不應該那樣做。 它改變了結果。

編輯2(錯誤,撤消)

問題是因為(float)Long.MAX_VALUE的結果超出了long的范圍。 因此,當將其轉換回去時,會將其鉗位到最大可表示值。

JLS (重點是我的):

將浮點數縮小為整數T的轉換需要兩個步驟:

[...]

否則,以下兩種情況之一必須為真:

[...]

該值必須太大(正值較大或正無窮大),並且第一步的結果是int或long類型的最大可表示值

為了證明這一點:

long x = Long.MAX_VALUE - 10;
System.out.println(x);                // 9223372036854775797
System.out.printf("%.0f", (float)x);  // 9223372036854776000
System.out.println((long)(float)x);   // 9223372036854775807 (look familiar?)

(感謝@TJ Crowder提供建議的示例。)

暫無
暫無

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

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