首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Java语言中,用浮点(或双精度)数除以零不会抛出java.lang.ArithmeticException: / by 0

为什么在Java语言中,用浮点(或双精度)数除以零不会抛出java.lang.ArithmeticException: / by 0
EN

Stack Overflow用户
提问于 2012-10-18 20:05:25
回答 6查看 54.6K关注 0票数 65

下面的语句将java.lang.ArithmeticException: / by zero抛出为显而易见。

代码语言:javascript
复制
System.out.println(0/0);

因为文字0被认为是int文字,所以在整数运算中不允许被零除。

然而,在下面的例子中,不会像java.lang.ArithmeticException: / by zero那样抛出任何异常。

代码语言:javascript
复制
int a = 0;
double b = 6.199;
System.out.println((b/a));

它显示Infinity

下面的语句无一例外地生成NaN (不是数字)。

代码语言:javascript
复制
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.

在这种情况下,这两个操作数都被认为是双精度的。

类似地,下面的语句不会抛出任何异常。

代码语言:javascript
复制
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);

它们产生以下输出。

代码语言:javascript
复制
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)……

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-18 20:16:32

简而言之,这就是IEEE-754标准中指定的方式,这也是Java的Floating-Point Operations所基于的。

754模型鼓励健壮的程序。它不仅适用于数字分析师,也适用于电子表格用户、数据库系统,甚至咖啡壶。NaNs和无穷大的传播规则允许无关紧要的异常消失。类似地,渐进式下溢在精度范围内维护错误属性。

当异常情况需要注意时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志进行检查。陷阱可用于停止程序,但无法恢复的情况极为罕见。对于嵌入式系统或网络代理来说,简单地停止程序不是一种选择。更常见的情况是,陷阱会记录诊断信息或替换有效的结果。

标志提供了可预测的控制流和速度。它们的使用要求程序员意识到异常情况,但是标记粘性允许程序员延迟处理异常情况,直到必要时。

票数 60
EN

Stack Overflow用户

发布于 2012-10-18 20:16:40

之所以这样,是因为IEEE754就是这样定义它的。

除以浮点0.0会产生NaN或+/-Inf,具体取决于分子是否为0。

除以整数0不在IEEE754中,它会生成一个异常--没有其他方法来指示错误,因为int不能表示NaNInf

生成异常类似于在x86微处理器上通过除以零生成的(软件) INT

票数 16
EN

Stack Overflow用户

发布于 2012-10-18 20:09:11

通向无限和超越

代码语言:javascript
复制
class DoubleDivision {

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

上面的代码和您提到的代码片段给出了infinity

为什么Java使用Doubles来表示小数。二进制不能完全表示一个数字,它只能表示一个近似值,因此,Java的double也不能。

想象一个令人难以置信地接近于零的数字。如果你懂微积分,想象一下零点的极限。这个变量会接近于零到某个可以想象的微小距离,但永远不会完全相等。你可以想象,对吧?好吧,假设数字is需要如此高的精度才能让Java表示,它放弃了,并将其称为0.0,因为它没有一个很好的替代方案。,这就是这里正在发生的事情。任何正则数除以一个非常接近于零的数,基本上就是无穷大的。试试:5 / (10^-100)

另请参阅Math Errors上的特殊浮点值一节,了解更多信息:)

相关问题:why does 1/0 give error but 1.0/0/0 give inf

更新:INT在set中没有infinity和NaN值,而float却有infinity和NaN值。(根据java遵循的IEEE 754标准)

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12954193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档