System.out.println((int)(99.9999999999999));
返回99
System.out.println((int)(99.999999999999999999999999999999999999999));
返回100
你能解释一下为什么吗?
答案 0 :(得分:5)
double
文字99.9999999999999
可以表示为double
,小于100
,因此转换为int
会截断小数部分{结果是{1}}。
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
字面值来比较2 double
个值,看它们是否完全相同double
值。
打印出来:
double
JLS, Section 3.10.2涵盖了浮点文字:
对于类Float的方法valueOf和包java的类Double,描述了从浮点数的Unicode字符串表示到内部IEEE 754二进制浮点表示的正确输入转换的详细信息。朗。
否则,s被视为代表通常的计算机化科学记数法中的精确十进制值"或者作为精确的十六进制值;然后,这个精确的数值在概念上被转换为"无限精确的"二进制值,然后通过IEEE 754浮点运算的通常舍入到最接近的规则舍入为double ,其中包括保留零值的符号。
(强调我的)
也就是说,该值被舍入以产生实际的99.9999999999999
99
false
100.0
100
true
值。
答案 1 :(得分:1)
在编译时解析浮点值。 javac编译器在将任何代码发送到.class文件之前将该值舍入为100,因为您编写的数字的最准确表示形式不是99.9999999999而是100:您的.0000000000099999999接近100而不是99.999999999(我可能与我的数字位数不一致)。我写了一些可以帮助你.NET Code Generation blog的东西。我写的任何内容对Java的应用与对C#(或C ++或任何其他使用浮点的语言)的应用不同。