-->

在Java中/零:为什么被零师不带浮点(或双精度)数字不扔java.lang.ArithmeticE

2019-06-18 13:48发布

下面的语句抛出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 )...

Answer 1:

总之,这就是它在IEEE-754标准,这是Java的指定方式浮点运算的基础上。

为什么不通过零(或溢出或下溢)部门停止该程序或触发一个错误? 为什么在数字的标准包括“不是一个数字”(NAN)?

754模式鼓励健壮的程序。 它的目的不仅是数字的分析师也为用户的电子表格,数据库系统,甚至是咖啡壶。 为NaN和无穷的传播规则允许无关紧要的例外消失。 同样地,渐进下溢在精确的范围内保持误差特性。

当特殊情况需要注意,他们可以立即通过陷阱或通过状态标志方便的时候检查。 陷阱可以用来停止程序,但无法恢复的情况是极其罕见的。 简单地停止一个程序不是针对嵌入式系统或网络代理的选项。 更多的时候,陷阱记录诊断信息或替代有效的结果。

旗同时提供可预测的控制流量和速度。 它们的使用需要程序员知道的得天独厚的条件,但标志粘性允许程序员推迟处理异常情况,直到必要的。



Answer 2:

这是这样,因为这是IEEE 754如何被定义的。

除以一个浮点0.0产生NaN或+/- Inf文件,这取决于分子是否是0。

除以整数0不是由IEEE 754所覆盖,并且产生一个异常-有指示,因为错误的没有别的办法int不能代表NaNInf

生成异常是类似于(软件) INT由分割在x86微处理器产生由零。



Answer 3:

超越无限

class DoubleDivision {

    public static void main(String[] args) {
        System.out.println(5.0/0.0);
    }
}

上面的代码,你所提到的片断给人infinity

为什么Java使用Double s到代表小数。 二进制不能完全代表一个数字,它只能代表一个近似值,因此,无论是能Java的两倍。

想象一下,一个令人难以置信的数量接近零。 如果你知道微积分,在零想象极限。 变量将趋近于零一些被假设的微小距离,但绝不等于完全吻合。 你可以想象一下,对不对? 好吧,假设这个数字是需要这么多精密的Java来表示,它放弃,并调用它0.0 ,因为它并没有一个很好的选择。 这就是发生在这里。 由超近数除以零任何正规数基本上是无穷大 。 尝试: 5 / (10^-100)

也请参见: 特殊浮点值的数学错误更多信息:)

相关的问题: 为什么1/0给予错误,但1.0 / 0/0给予INF

UPDATE: INT没有一个无穷大和NaN ,而浮动确实有无限和设定值NaN价值。 (根据IEEE 754个标准的如下的java)



Answer 4:

当存在由零的鸿沟,计算机不能创建该结果作为数的表示。 该计算机需要表明的结果是不是数字。

对于浮点值可以产生一种特殊的不非数字标记值,因为有一些32位(对于float )和64位(对于double )位模式不表示一个数目,并且因此可以被解释作为不非数值( NaN )。

对于使用普通二进制补码方案(如Java要求)的整数值,所有32位(对于int )和64位(对于long )位模式代表一个数字。 因此,使用定点计算机无法报告问题。 它必须以某种方式将问题报告“带外”。 抛出异常是选择出来的Java带方法。



Answer 5:

爪哇遵循IEEE 754标准定义的值被零在分割的情况下默认返回。 http://en.wikipedia.org/wiki/IEEE_754#Exception_handling

除零(有限操作数的运算给出一个确切的无限结果,例如,1/0或日志(0))(±返回默认无穷大)。



Answer 6:

import java.util.Scanner;

public class Division {

    public static void main(String[] args) {
        int a, b;
        float result;

        Scanner input = new Scanner(System.in);
        System.out.println("Enter value for a : ");
        a = input.nextInt();

        System.out.println("Enter value for b : ");
        b = input.nextInt();

        try {
            /* here we used "if clause" because result will be in float
             note: Here result is in float, so JVM Cant Catch Exception.
             if we Try to Divide with Zero with Float Values It gives Output as
             Divided by Zero is Infinity */
            if (b != 0) {
                result = (float) a / b;
                System.out.println("Result of " + a + " divided by " + b + " is : " + result);
            } else // here result will be in integer so Jvm can easily Catch The Exception
            {
                result = a / b;
            }
        } catch (ArithmeticException e) {
            System.out.println("Sorry Division By Zero Is Not Possible");
        }
    }
}

/* Ouput :
Enter value for a :2
Enter value for b : 7
Result of 2 divided by 7 is : 0.2857143 */

 /* Ouput :
Enter value for a : 16
Enter value for b : 0
Sorry Division By Zero Is Not Possible */


文章来源: Why does division by zero with floating point (or double precision) numbers not throw java.lang.ArithmeticException: / by zero in Java