除以0.0时,为什么Java不抛出异常?


68

我有代码来计算两个数字之间的百分比差(oldNum - newNum) / oldNum * 100;--两个数字均为doubles。我希望在oldNum为0的情况下必须添加某种检查/异常处理。但是,当我对oldNum和newNum的值均为0.0进行测试运行时,执行继续,就好像什么都没有发生并且没有引发任何错误。使用ints来运行此代码肯定会导致算术除零异常。为什么Java在涉及doubles时会忽略它?


4
好问题-整数和双重行为之间的不一致会增加混乱和麻烦。
史蒂夫·B


2
@Raedwald-考虑到这个问题是在您链接的问题之前2 1/2年发布的,我想说这个问题是该问题的(可能)重复部分:)
froadie 2014年

Answers:


46

从数学上讲,被零除的结果是undefined,可以用浮点数/双精度数表示(因为NaN-不是数字),但是从根本上讲这不是错误的。

由于整数必须具有特定的数值,因此在处理它们时必须除以零而引发错误。


7
究竟。:这是在Java语言规格此处定义java.sun.com/docs/books/jls/third_edition/html/...
迈克尔·迈尔斯

6
我认为应该有一个Integer.NaN
OscarRyz

13
@trinithis:您的解释与没有Integer.NaN的原因无关。原因很简单,浮点算术的IEEE标准规定了这样的特殊值,而整数算术(二进制补码)的准标准则没有这样的特殊值,因此将其留给实现者如何处理被零除的问题(引发中断)。或例外,请指定一个特殊值,或仅保留结果未定义)。
Michael Borgwardt 2010年

2
@Kris:严格来说,它不能是无穷大的,因为lim(1 / x)与x-> 0+和x-> 0-不同。但这只是个小问题。
eaolson

8
x / 0不是无限,结果不确定。当y趋于0时,x / y趋于无穷大。对不起,线程坏死。
这么多地精

110

Javafloatdouble类型,与几乎所有其他语言(以及几乎所有硬件FP单元)一样,实现了针对浮点数学的IEEE 754标准,该标准要求除以零以返回特殊的“无穷大”值。引发异常实际上会违反该标准。

整数算法(由Java以及大多数其他语言和硬件以二进制补码表示)是不同的,并且没有特殊的无穷或NaN值,因此抛出异常是一种有用的行为。


4
这个问题的正确答案应该是这样。我需要知道为什么float并且double不会导致异常。谢谢。
Cengiz能

1
这应该是正确的答案。当前被标记为正确的答案并没有回答这个问题,也没有说清楚,Java正在以下IEEE 754
Necrototem


4

虽然Java开发人员了解双基本类型和Double类,同时做浮点运算他们没有给予足够的重视Double.INFINITYNaN-0.0和支配它们涉及算术计算的其他规则。

这个问题的简单答案是它不会抛出ArithmeticException并返回Double.INFINITY。另外,请注意,即使比较本身是,比较也x == Double.NaN总是求和。falsexNaN

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

它可能对您有帮助。


4

除以零(0或0.00)时

  1. 如果您将double除以0,JVM将显示Infinity

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }

    安慰: Infinity

  2. 如果将int除以0,则JVM将抛出Arithmetic Exception

    public static void main(String [] args){ int a=10; System.out.println(a/0); }

    安慰: Exception in thread "main" java.lang.ArithmeticException: / by zero

  3. 但是,如果将int除以0.0,则JVM将显示Infinity:

    public static void main(String [] args){ int a=10; System.out.println(a/0.0); }

    安慰: Infinity

这是因为JVM会自动将cast int类型键入为double,因此我们获得了无限而不是ArithmeticException。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.