繁体   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