在数学运算中运算除法的时候,相信大家心里都会绷起一根弦(至少会有这样的潜意识):除数不能为0。能这么想的程序员相信都是非常注重代码健壮性的,这是个好习惯,但是除数是不是一定不能是0呢?
在做整型除法的时候,除数是不能为0的,否则会报异常。如下面这句代码:
int d = 2/0;
执行的时候会报java.lang.ArithmeticException: / by zero
在做浮点数运算的时候,除数是可以为0的,如下面这句代码:
float a = 5.0/0;
这句话是不会报异常的,a的值为Infinity,表示无限大。
如果这样写:
float a = 0.0/0;
a的值为Nan,表示非数值。
在Float和Double类中定义了Infinity和Nan,以float为例:
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
public static final float NaN = 0.0f / 0.0f;
这些值得定义有什么意义呢,个人理解是在某些算数运算中可以省略一些边缘的条件的判断。比如下面这句代码:
Math.atan(a / b)
a和b都是浮点数,此时就不用考虑b是不是为0了,当b为0的时候,无穷大的反正切值为π/2,该运算是有意义的,运算结果也正是如此,我们就不用把90°角拿出来单独考虑了。但是换成sin或者cos或者asin或者acos,无穷大就没有意义了,
System.out.println(Math.sin(2.0/0));
运算结果为NaN。