为什么';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。