System.out.println(1.0 / 0); 为什么
2018-12-29 本文已影响23人
烛火的咆哮
遇到了一个简单的细节, 做个记录,直接贴代码
System.out.println(1.0 / 0);
//下面报错
System.out.println(1 / 0);
- int型数据,除0会发生报错,信息如下:
Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
at leetcode_normal.Test1.main(Test1.java:111)
- 然而,
System.out.println(1.0 / 0);
为什么返回值会是Infinity
- 各种查找得,
Infinity
表示无穷大,java中,只有浮点类型数据存在这种表达形式, 其他类型都有明确的数据范围 - 当double类型数据除int类型数据时,隐式类型转换,int类型->double类型,即
System.out.println(1.0 / 0);
转为为System.out.println(1.0 / 0.0);
. - 而浮点运算0.0作为除数时,会转为一个无限接近于0的小数,而不是彻底的zero,
再贴一下完整的代码
System.out.println(1.0 / 0);
System.out.println(1.0 / 0.0);
System.out.println((long)(1.0 / 0.0));
System.out.println(1 / 0);
Infinity
Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
at leetcode_normal.Test1.main(Test1.java:112)
9223372036854775807
- 可以看到, double/0与double/0.0结果都为无穷大,
- 用long返回可以得到一个非常非常大的数字
- 另外,double源码中有关无穷大与无穷小的定义为
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;