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.9999999999999
和254.99999999999999
0 10000000110 1111110111111111111111111111111111111111111111111100 0 10000000110 1111111000000000000000000000000000000000000000000000
我们可以把它作为Long.toString(dbl.doubleToLongBits(dbl), 2);
整数部分是
1111110 1111111
省略前导1位,因此实际的整数值是
11111110 - 254 11111111 - 255
请注意,将double转换为整数不是通过舍入而是截断