为什么由0.0分的时候没有的Java抛出异常?为什么由0.0分的时候没有的Java抛出异常?(Why

2019-05-09 04:28发布

我有代码来计算2号之间的百分比差异- (oldNum - newNum) / oldNum * 100; -在这两个数字是double秒。 我预计将有增加某种检查/异常的情况下,oldNum处理的是0。但是,当我做了两个oldNum和newNum 0.0值的试运行,继续执行,就好像什么也没发生,并抛出任何错误。 运行该代码int小号肯定会导致算术师零例外。 为什么Java的忽略它,当它涉及到double S'

Answer 1:

除以零的结果是,从数学上讲, 未定义 ,其可与一个浮子来表示/双(如NaN -非数字),它是没有,但是,在不对任何根本的意义。

作为一个整数必须持有具体的数值,错误必须在被零除与他们打交道时抛出。



Answer 2:

Java的floatdouble类型,如几乎任何其他语言在那里(和几乎任何硬件FP单元),执行IEEE 754标准浮点运算,它由零责成师返回一个特殊的“无限”的值。 抛出异常实际上违反该标准。

整数运算(如实施补的Java表示和大多数其他语言和硬件)是不同的,有没有什么特别的无穷大或NaN值,从而抛出异常是有一个有用的行为。



Answer 3:

双存储方式是一个int很大的不同。 见http://firstclassthoughts.co.uk/java/traps/java_double_traps.html针对Java如何处理双重计算更详细的解释。 你也应该对浮点数读了起来,特别的概念不是数字(NAN) 。

如果您想了解更多关于浮点表示,我建议阅读本文档 (Word格式,抱歉)。 它深入探讨了数字的二进制表示,这可能有助于你的理解。



Answer 4:

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

简单的回答这个问题的是,它不会抛出ArithmeticException并返回Double.INFINITY 。 另外,还要注意比较x == Double.NaN始终计算为false ,即使x本身就是一个NaN

为了测试xNaN ,应该使用该方法调用Double.isNaN(x)以检查是否给定数量是NaN与否。 这是非常接近NULLSQL

它可能对你有帮助。



Answer 5:

当由零(0或0.00)划分

  1. 如果您除以0双,JVM将显示无穷大

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

    控制台: Infinity

  2. 如果您除以0 INT,那么JVM将抛出算术异常

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

    控制台: Exception in thread "main" java.lang.ArithmeticException: / by zero

  3. 但是,如果我们通过0.0除以INT,那么JVM将呈现无限:

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

    控制台: Infinity

这是因为JVM会自动强制类型转换INT翻一番,所以我们得到无限的,而不是ArithmeticException。



文章来源: Why doesn't Java throw an Exception when dividing by 0.0?