注册

1.0 除 0 没抛出错误,我差点被输送社会


简言


在项目中,我使用了错误的除法,除零没有抛出错误,程序运行正常,但是数据异常。组长说要把我输送社会,老板说还可以挽留一下,我们来复盘一下这次错误。


先让我们来试一试


public class TestDouble {   
public static void main(String[] args) {
System.out.println(1.0 / 0);
}
}

你认为的我认为的它应该会抛出 ArithmeticException 异常


但是它现在输出了 Infinity



为什么呢?


Double 数据类型支持无穷大


还有其他类型支持吗?


有,还有 Float


下面我们来查看 Double 源码,可以看到


/** 
* 一个常数,保持类型的正无穷大
*/

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
/**
* 一个常数,保持类型的负无穷大
*/

public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
/**
* 一个常数,非数值类型
*/

public static final double NaN = 0.0d / 0.0;

下面来试验下 0.0/0 与 -1.0/0


Double 正无穷 = 1.0 / 0;
Double 负无穷 = -1.0 / 0;
System.out.println("正无穷:" + 正无穷);
System.out.println("负无穷:" + 负无穷);
Double 非数值 = 0.0 / 0;
System.out.println("非数值 0.0/0 ->" + 非数值);

输出:


正无穷:Infinity
负无穷:-Infinity
非数值 0.0/0 ->NaN

对无穷大进行运算


下面来测试对 Float 类型与 Doubloe 类型无穷大进行运算


public static void testFloatInfinity() {
Float infFloat = Float.POSITIVE_INFINITY;
Double infDouble = Double.POSITIVE_INFINITY;
System.out.println("infFloat + 5 = " + (infFloat + 5));
System.out.println("infFloat - infDouble = " + (infFloat - infDouble));
System.out.println("infFloat * -1 = " + (infFloat * -1));
}

输出:


infFloat + 5 = InfinityinfFloat - infDouble = NaNinfFloat * -1 = -Infinity

可以注意到 1,3 行运算符合我们的预计结果


ps: Infinity- Infinity 的结果不是数字类型


对这些值进行判断


public static void checkFloatInfinity() {   
Double 正无穷 = 1.0 / 0;
Double 负无穷 = -1.0 / 0;
Double 非数值 = 0.0 / 0;
System.out.println("判断正无穷: " + Double.isInfinite(正无穷));
System.out.println("判断负无穷: " + (Double.NEGATIVE_INFINITY == 负无穷));
System.out.println("判断非数值(==): " + (Double.NaN == 非数值));
System.out.println("判断非数值(isNaN): " + Double.isNaN(非数值));
}

输出:


判断正无穷: true
判断负无穷: true
判断非数值(==): false
判断非数值(isNaN): true


ps: 判断 NaN 不要使用 ==


作者:程序员鱼丸
来源:juejin.cn/post/7135621128818524174

0 个评论

要回复文章请先登录注册