Double.intValue()如何工作?

这段代码

Double dbl = 254.9999999999999; Integer integ = dbl.intValue(); System.out.println(integ); 

显示254,但更多一个“9”

 Double dbl = 254.99999999999999; Integer integ = dbl.intValue(); System.out.println(integ); 

它已经是255 ..为什么?

要知道double的确切值,可以使用BigDecimal:

 System.out.println(new BigDecimal(254.9999999999999)); System.out.println(new BigDecimal(254.99999999999999)); 

打印:

 254.9999999999998863131622783839702606201171875 255 

所以这仅仅是因为(双重精度的限制)……

 System.out.println(254.9999999999999 == 255.0); System.out.println(254.99999999999999 == 255.0); 

版画

 false true 

这应该给你一个提示。 double类型最多可以表示16位有效数字,并且您的文字有17个。因此,最接近第二个十进制文字的double值是255.0

对于第二行代码,Eclipse实际上会发出警告:

比较相同的表达式

因为已经是编译器知道这些只是完全相同的double值的两个文字。

double是数字的64位二进制浮点表示。 二进制浮点数不能精确地表示大多数小数。 它们可以精确地代表1 / 2,1 / 4,1 / 64 + 1/32等,但它们不能精确地代表0.9或0.1。 而且它们的精度有限。

在您的情况下,254.99999999999999与内部255.0具有完全相同的表示forms。 您可以通过使用Double.toHexString方法检查二进制分数的hex版本来查看此内容。 因为254.99999999999999已经等于255.0,当你通过将小数部分转换为32位整数来截断小数部分时,最终会得到255。

 System.out.println("a: " + Double.toHexString(254.99999999999999d)); System.out.println("b: " + Double.toHexString(255d)); 

产量

 a: 0x1.fep7 b: 0x1.fep7 

答案很简单。 你在代码中用一个9以上写的十进制数更接近于双精度数,它恰好代表任何其他双精度数的255。 因此,编译中使用的双精度恰好等于255.虽然十进制数小于9,但最佳表示为下面显示的双精度数。 这意味着它比任何其他双重更接近特定的双重。

看看这个演示: http : //ideone.com/hSqJTJ

这是输出:

 Original double: 254.9999999999999 Cast to int: 254 Exact double: 254.9999999999998863131622783839702606201171875 Original double: 255.0 Cast to int: 255 Exact double: 255 

双二进制格式是sign(1)+ exponent(11)+ fraction(53)。 二进制forms为254.9999999999999254.99999999999999

 0 10000000110 1111110111111111111111111111111111111111111111111100 0 10000000110 1111111000000000000000000000000000000000000000000000 

我们可以把它作为Long.toString(dbl.doubleToLongBits(dbl), 2);

整数部分是

 1111110 1111111 

省略前导1位,因此实际的整数值是

 11111110 - 254 11111111 - 255 

请注意,将double转换为整数不是通过舍入而是截断