为了账号安全,请及时绑定邮箱和手机立即绑定

为什么用浮点数(或双精度)将数字除以零不会在Java中抛出java.lang.Arithmetic

为什么用浮点数(或双精度)将数字除以零不会在Java中抛出java.lang.Arithmetic

月关宝盒 2019-11-30 10:25:40
下面的语句java.lang.ArithmeticException: / by zero很明显。System.out.println(0/0);因为文字0被视为int文字,并且在整数算术中不允许除以零。但是,以下情况不会引发类似的任何异常java.lang.ArithmeticException: / by zero。int a = 0;double b = 6.199;System.out.println((b/a));显示Infinity。以下语句NaN无例外地产生(非数字)。System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.在这种情况下,两个操作数都被视为双精度。同样,以下语句也不会引发任何异常。double div1 = 0D/0; //or 0D/0Ddouble div2 = 0/0D; //or 0D/0DSystem.out.printf("div1 = %s : div2 = %s%n", div1, div2);System.out.printf("div1 == div2 : %b%n", div1 == div2);System.out.printf("div1 == div1 : %b%n", div1 == div1);System.out.printf("div2 == div2 : %b%n", div2 == div2);System.out.printf("Double.NaN == Double.NaN : %b%n", Double.NaN == Double.NaN);System.out.printf("Float.NaN == Float.NaN : %b%n", Float.NaN == Float.NaN);它们产生以下输出。div1 = NaN : div2 = NaNdiv1 == div2 : falsediv1 == div1 : falsediv2 == div2 : falseDouble.NaN == Double.NaN : falseFloat.NaN == Float.NaN : false它们都返回false.为什么用浮点数或双精度数允许此操作(除以零)?顺便说一下,我可以理解,浮点数(双精度数)的值代表正无穷大, 负无穷大,而不是数字(NaN)...
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

简而言之,这就是在IEEE-754标准中指定的方式,这是Java的浮点运算所基于的。


为什么不除以零(或上溢或下溢)会停止程序或触发错误?为什么数字标准包含“非数字”(NaN)?


754模型鼓励强大的程序。它不仅适用于数值分析人员,还适用于电子表格用户,数据库系统甚至咖啡壶。NaN和无穷大的传播规则允许无关紧要的异常消失。同样,渐进式下溢会在精度范围内保持错误属性。


当需要注意特殊情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志对其进行检查。陷阱可用于停止程序,但是不可恢复的情况极为罕见。对于嵌入式系统或网络代理,仅停止程序是不可行的。陷阱通常会记录诊断信息或替代有效结果。


标志提供可预测的控制流和速度。它们的使用要求程序员注意异常情况,但是标志的粘性允许程序员将异常情况的处理推迟到必要时。


查看完整回答
反对 回复 2019-11-30
?
森栏

TA贡献1810条经验 获得超5个赞

超越无限


class DoubleDivision {


    public static void main(String[] args) {

        System.out.println(5.0/0.0);

    }

}

上面的代码以及您提到的摘录给出了infinity。


为什么Java使用Doubles代表小数。二进制不能完全表示一个数字,它只能表示一个近似值,因此Java的double都不能。


想象一个数字非常接近零。如果您知道微积分,请想象一个零极限。变量将接近零到某个可以想象到的微小距离,但永远不会完全相等。你可以想象的吧?好吧,假设该数字对于Java表示需要非常高的精度,它会放弃并调用它,0.0因为它没有很好的选择。这就是这里发生的事情。任何规则数除以超级接近数等于零的值基本上就是infinity。试试看:5 / (10^-100)。


另请参阅部分:数学错误中的特殊浮点值以获取更多信息:)


相关问题:为什么1/0给错误而1.0 / 0/0给inf


更新: INT没有NaNset 的无穷大和值,而float却有无穷大和NaN值。(根据java遵循的IEEE 754标准)


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 642 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信