[英]`(long)(float)Long.MAX_VALUE` has the exact value, how is that possible?
Long
比Float
擁有更多的字節,因此我預計最高的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.