猿问

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

下面的语句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/0D

double div2 = 0/0D; //or 0D/0D


System.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 = NaN

div1 == div2 : false

div1 == div1 : false

div2 == div2 : false

Double.NaN == Double.NaN : false

Float.NaN == Float.NaN : false

它们都返回false.为什么用浮点数或双精度数允许此操作(除以零)?


顺便说一下,我可以理解,浮点数(双精度数)的值代表正无穷大, 负无穷大,而不是数字(NaN)...


月关宝盒
浏览 643回答 3
3回答

绝地无双

简而言之,这就是在IEEE-754标准中指定的方式,这是Java的浮点运算所基于的。为什么不除以零(或上溢或下溢)会停止程序或触发错误?为什么数字标准包含“非数字”(NaN)?754模型鼓励强大的程序。它不仅适用于数值分析人员,还适用于电子表格用户,数据库系统甚至咖啡壶。NaN和无穷大的传播规则允许无关紧要的异常消失。同样,渐进式下溢会在精度范围内保持错误属性。当需要注意特殊情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志对其进行检查。陷阱可用于停止程序,但是不可恢复的情况极为罕见。对于嵌入式系统或网络代理,仅停止程序是不可行的。陷阱通常会记录诊断信息或替代有效结果。标志提供可预测的控制流和速度。它们的使用要求程序员注意异常情况,但是标志的粘性允许程序员将异常情况的处理推迟到必要时。

森栏

超越无限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标准)
随时随地看视频慕课网APP

相关分类

Java
我要回答