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

时间:2014-04-22 18:13:31

标签: java casting

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

返回99

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

返回100

你能解释一下为什么吗?

2 个答案:

答案 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二进制浮点表示的正确输入转换的详细信息。朗。

Double.valueOf javadocs状态:

  

否则,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 ++或任何其他使用浮点的语言)的应用不同。