为什么';Java除以0.0时是否引发异常?

为什么';Java除以0.0时是否引发异常?,java,types,integer,double,divide-by-zero,Java,Types,Integer,Double,Divide By Zero,我有代码来计算两个数字之间的百分比差异-(oldNum-newNum)/oldNum*100-其中两个数字都是双精度的。我希望在oldNum为0的情况下必须添加某种检查/异常处理。然而,当我对oldNum和newNum执行值均为0.0的测试运行时,执行继续进行,就好像什么都没有发生,也没有抛出错误一样。使用ints运行此代码肯定会导致算术除零异常。为什么Java在谈到双精度时会忽略它呢?从数学上讲,被零除的结果是未定义的,可以用浮点/双精度来表示(如NaN-不是数字),但从根本上讲,它并没有错

我有代码来计算两个数字之间的百分比差异-
(oldNum-newNum)/oldNum*100-其中两个数字都是双精度的。我希望在oldNum为0的情况下必须添加某种检查/异常处理。然而,当我对oldNum和newNum执行值均为0.0的测试运行时,执行继续进行,就好像什么都没有发生,也没有抛出错误一样。使用
int
s运行此代码肯定会导致算术除零异常。为什么Java在谈到双精度时会忽略它呢?

从数学上讲,被零除的结果是未定义的,可以用浮点/双精度来表示(如
NaN
-不是数字),但从根本上讲,它并没有错


由于整数必须包含特定的数值,因此在处理它们时,必须在除零时抛出一个错误。

存储double的方式与int的方式完全不同。有关Java如何处理double计算的更详细说明,请参阅。您还应该阅读浮点数,特别是浮点数的概念


如果您对学习浮点表示法感兴趣,我建议您阅读(Word格式,对不起)。它深入研究了数字的二进制表示形式,这可能有助于您的理解。

Java的
float
double
类型,与几乎所有其他语言(以及几乎所有硬件FP单元)一样,实现浮点数学标准,该标准要求除以零返回一个特殊值“无穷大”值。抛出异常实际上违反了该标准


整数算术(由Java和大多数其他语言和硬件实现)是不同的,没有特殊的无穷大或NaN值,因此抛出异常是一种有用的行为。

尽管Java开发人员知道双原语类型和
double
类,但在进行浮点运算时,他们没有对
double.infinity
NaN
-0.0
和d管理涉及他们的算术计算的其他规则

这个问题的简单答案是,它不会抛出
arithmetricexception
并返回
Double.INFINITY
。另外,请注意,比较
x==Double.NaN
总是计算为
false
,即使
x
本身是
NaN

要测试
x
是否为
NaN
,应使用方法调用
Double.isNaN(x)
检查给定的数字是否为NaN。这非常接近
SQL
中的
NULL


它可能对您有所帮助。

当除以0(0或0.00)

  • 如果将double除以0,JVM将显示无穷大

    publicstaticvoidmain(String[]args){double a=10.00;System.out.println(a/0);}

    控制台:
    无限

  • 如果将int除以0,JVM将抛出算术异常

    publicstaticvoidmain(字符串[]args){
    INTA=10;
    系统输出打印项次(a/0);
    }

    控制台:
    线程“main”java.lang.arithmetricException中的异常:/by zero

  • 但是如果我们将int除以0.0,那么JVM将显示无穷大:

    publicstaticvoidmain(字符串[]args){
    INTA=10;
    系统输出打印项次(a/0.0);
    }

    控制台:
    Infinity


  • 这是因为JVM会自动将cast int键入double,所以我们得到的是无穷大而不是算术异常。

    正是如此。这在Java语言规范中有定义:我认为应该有一个整数。NaN@trinithis:你的解释与没有整数的原因无关。NaN。原因很简单,IEEE标准浮点运算的rd要求使用此类特殊值,而整数运算的准标准(2的补码)没有此类特殊值,因此如何处理零除(引发中断或异常,指定特殊值,或只保留未定义的结果)留给实现者@Kris:严格来说,它不可能是无穷大,因为lim(1/x)与x->0+和x->0-不同。但这是一个小问题。x/0不是无穷大,结果是未定义的。当y趋于0时,x/y趋于无穷大。为线程坏死感到抱歉。好问题-整数和双精度行为之间的不一致增加了混乱和麻烦。@Raedwald可能重复-考虑到这个问题是posted在你联系的那个人之前2年半,我想说这个问题是(可能的)这个问题的正确答案应该是这样的。我需要知道为什么
    float
    double
    不会导致异常。谢谢。这应该是标记为正确的答案。当前标记为正确的答案没有回答这个问题,也没有表明Java遵循IEEE 754。