System.out.println((int)(99.9999999999999));
返回99
System.out.println((int)(99.999999999999999999999999999999999999999));
返回100
你能解释一下为什么吗?
的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);
我用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.
否则,s被认为代表通常的"计算机化科学记数法"中的精确十进制值或者精确的十六进制值; 然后,这个精确的数值在概念上被转换为"无限精确"的二进制值,然后通过IEEE 754浮点运算的通常的舍入到最接近的规则舍入为double类型,其中包括保留零值的符号.
(强调我的)
也就是说,该值被舍入以产生实际double值.
| 归档时间: | 
 | 
| 查看次数: | 134 次 | 
| 最近记录: |