为什么Double.infinite不为无限分数返回true?

时间:2014-05-16 19:12:08

标签: java double

Double.isInfinite(1.0 / 0.0);

返回true。

Double.isInfinite(1.0 / 3.0);

但这没有,根据我的理解,这将是一个无穷大的数字,因为这会将0.33333_返回到无穷大。

为什么?

3 个答案:

答案 0 :(得分:11)

如果值无限长,

Double.isInfinite不会返回true;如果值本身是无限的(正面或负面),则返回true。

另外,1.0 / 3.0在基数10中是无限长的,但在其他基数中没有,如基数3。

答案 1 :(得分:2)

类型double只能代表某些分数。表达式1.0 / 3.0的产量不会产生“三分之一”的分数,而是选择double能够代表的最接近的分数。在double可以表示的大约18,000,000,000,000,000,000个分数中,最接近三分之一的分数是6004799503160661/18014398509481984,因此表达式1.0/3.0产生该精确值。当以十进制或二进制格式表示时,实际分数“三分之一”将无限长,而在该词的任何意义上,最接近的double不是“无限”;即使以十进制格式写出也只需要小数点右边的54位数。

答案 2 :(得分:1)

IEEE-754(+/-无穷大)中,有两个值定义为infinity。由于double是浮点数,因此遵循这些规则。但是,如果您要使用任意精度类型(如BigDecimal),您可能能够实现此类测试 - 例如,

public static void main(String[] args) {
    BigDecimal ONE = BigDecimal.ONE;
    BigDecimal THREE = new BigDecimal("3");
    BigDecimal THIRD = ONE.divide(THREE);
    System.out.println(THIRD);
}

将抛出异常

  

线程中的异常" main" java.lang.ArithmeticException:非终止十进制扩展;没有确切的可表示的十进制结果。