Double.intValue()如何工作?

Art*_*kov 29 java double integer

这段代码

Double dbl = 254.9999999999999;
Integer integ = dbl.intValue();
System.out.println(integ);
Run Code Online (Sandbox Code Playgroud)

显示254,但更多一个"9"

Double dbl = 254.99999999999999;
Integer integ = dbl.intValue();
System.out.println(integ);
Run Code Online (Sandbox Code Playgroud)

它已经是255 ..为什么?

ass*_*ias 30

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

System.out.println(new BigDecimal(254.9999999999999));
System.out.println(new BigDecimal(254.99999999999999));
Run Code Online (Sandbox Code Playgroud)

打印:

254.9999999999998863131622783839702606201171875
255
Run Code Online (Sandbox Code Playgroud)

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

  • 在考虑它时,这并不令人惊讶.一个双人最多只能存储18446744073709551616个不同的值.除了0.0到1.0之外,还有更多的数字.因此,由于double不能存储所有可能的数字,因此它存储了无法精确存储的近似值.例如,最近的256.99999999999999的双近似值是255,而最接近的254.9999999999999是254.9999999999998863131622783839702606201171875 (5认同)
  • @nos在更正式的术语中,最接近的数字"254.99999999999999"的"double"值是"255.0". (5认同)

Mar*_*nik 13

System.out.println(254.9999999999999 == 255.0);
System.out.println(254.99999999999999 == 255.0);
Run Code Online (Sandbox Code Playgroud)

版画

false
true
Run Code Online (Sandbox Code Playgroud)

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

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

比较相同的表达式

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