簡體   English   中英

Java中從double到int的顯式轉換如何?

[英]How the explicit cast from double to int rounds in Java?

System.out.println((int)(99.9999999999999));

返回99

System.out.println((int)(99.999999999999999999999999999999999999999));

返回100

你能解釋一下為什么嗎?

double字面值99.9999999999999可以表示為小於100double ,因此轉換為int截斷小數部分, 99就是結果。

double literal 99.999999999999999999999999999999999999999具有最接近的實際值100 ,並且此處的int100

System.out.println(99.9999999999999);
System.out.println((int)(99.9999999999999));
System.out.println(99.9999999999999 == 100.0);

System.out.println(99.999999999999999999999999999999999999999);
System.out.println((int)(99.999999999999999999999999999999999999999));
System.out.println(99.999999999999999999999999999999999999999 == 100.0);

我在這里使用100.0作為double字面值來比較2個double值,看它們是否是完全相同的double值。

打印出:

99.9999999999999
99
false
100.0
100
true

JLS,第3.10.2節涵蓋了浮點文字:

有關從浮點數的Unicode字符串表示到內部IEEE 754二進制浮點表示的正確輸入轉換的詳細信息,請參閱類Float的方法valueOf和包java.lang的類Double。

Double.valueOf javadocs狀態:

否則,s被認為代表通常的“計算機化科學記數法”中的精確十進制值或者精確的十六進制值; 然后,這個精確的數值在概念上被轉換為“無限精確”的二進制值,然后通過IEEE 754浮點運算的通常的舍入到最接近的規則舍入為double類型 ,其中包括保留零值的符號。

(強調我的)

也就是說,該值被舍入以產生實際的double值。

在編譯時解析浮點值。 javac編譯器在將任何代碼發送到.class文件之前將該值舍入為100,因為您編寫的數字的最准確表示形式不是99.9999999999而是100:您的.0000000000099999999接近100而不是99.999999999(我可能與我的數字位數不一致)。 我在.NET代碼生成博客上寫了一些可能對你有幫助的東西。 我寫的任何內容都不同於對C#(或C ++或任何其他使用浮點的語言)的應用。

暫無
暫無

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

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