Java中从double到int的显式转换如何?

use*_*614 3 java casting

System.out.println((int)(99.9999999999999));
Run Code Online (Sandbox Code Playgroud)

返回99

System.out.println((int)(99.999999999999999999999999999999999999999));
Run Code Online (Sandbox Code Playgroud)

返回100

你能解释一下为什么吗?

rge*_*man 5

double文字99.9999999999999可以被表示为一个double小于100,所以铸造到int截断的小数部分,99是结果.

double文本99.999999999999999999999999999999999999999具有最接近的实际价值100,并铸造int简直是100在这里.

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);
Run Code Online (Sandbox Code Playgroud)

我用100.0double文字在这里,比较2倍double的值,看看它们是完全一样的double价值.

打印出:

99.9999999999999
99
false
100.0
100
true
Run Code Online (Sandbox Code Playgroud)

JLS,第3.10.2节涵盖了浮点文字:

有关从浮点数的Unicode字符串表示到内部IEEE 754二进制浮点表示的正确输入转换的详细信息,请参阅类Float的方法valueOf和包java.lang的类Double.

Double.valueOfjavadocs状态:

否则,s被认为代表通常的"计算机化科学记数法"中的精确十进制值或者精确的十六进制值; 然后,这个精确的数值在概念上被转换为"无限精确"的二进制值,然后通过IEEE 754浮点运算的通常的舍入到最接近的规则舍入为double类型,其中包括保留零值的符号.

(强调我的)

也就是说,该值被舍入以产生实际double值.