我已经开始阅读Java8的文档,并尝试了不同的示例代码。发现以下奇怪行为。
样本1
Double di = new Double(Math.pow(2,32-1));
System.out.printf("%f\n",di.doubleValue()); //2147483648.000000
int a= di.intValue();
System.out.println(a); //2147483647
Sample2
Double di = new Double(Math.pow(2,32-1)) - 1.0;
System.out.printf("%f\n",di.doubleValue()); //2147483647.000000
int a= di.intValue();
System.out.println(a); //2147483647
在两种情况下,int值都返回相同的值吗?
int值不能超过Integer.MAX_VALUE,该值恰好是2147483647。调用intValue()时,您自愿放弃所有尾巴。
[请参阅https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3重要部分,最后以粗体突出显示:
这是因为Java中int
类型的最大值为2147483647
。当您调用Double::doubleValue
时,如果您尝试转换的值超出范围并且由此方法的docs声明,则它将执行缩小转换。
在缩小原始转换后,将此Double的值返回为int。