当前位置: 首页 > 知识库问答 >
问题:

为什么用浮点(或双精度)数字除以零不抛出Java.lang.ArithmeticException:/by zero

曾云
2023-03-14

下面的语句抛出java.lang.ArithmeticException:/by Zero

System.out.println(0/0);

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

int a = 0;
double b = 6.199;
System.out.println((b/a));

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

System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.

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

同样,下面的语句也不会抛出任何异常。

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);

它们会产生以下输出。

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)……

共有1个答案

韩羽
2023-03-14

简而言之,这就是IEEE-754标准中指定的方式,这是Java浮点运算的基础。

为什么除以零(或溢出,或下溢)不停止程序或触发错误?为什么关于数字的标准包括“non-a-number”(NaN)?

754模式鼓励稳健的计划。它不仅适用于数字分析员,也适用于电子表格用户、数据库系统,甚至是咖啡壶。NAN和无穷大的传播规则允许无关紧要的例外消失。类似地,渐进式下溢在精度范围内保持误差属性。

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

 类似资料:
  • 我不明白为什么浮点值与双精度值不同。从下面的示例来看,对于相同的操作,float 提供的结果似乎与双精度型不同: 输出: 你能解释一下float和double之间的区别吗?

  • 问题内容: 为什么单精度浮点数具有7位精度(或双精度15-16位精度)? 谁能解释一下如何根据为float(Sign(32)Exponent(30-23),Fraction(22-0))分配的32位来达到这个目标? 问题答案: 有效位的23个小数位(22-0)出现在内存格式中,但是总精度实际上是24位,因为我们假设有一个前导1。这等效于十进制数字。 双精度浮点数的分数为52位,加上前导1为53。因

  • 问题内容: 从双精度中删除尾随零的功能是什么? 问题答案: 在Swift 4中,您可以这样做: 使用示例: 结果:128834.567891 您还可以计算字符串中有多少个十进制数字:

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

  • 单精度浮动值和双精度浮动值有什么区别?

  • 问题内容: 我正在为一个学校项目创建一个RPN计算器。我在使用模运算符时遇到了麻烦。由于我们使用的是double数据类型,因此模数不适用于浮点数。例如,0.5%0.3应该返回0.2,但是我得到除以零的异常。 该指令说要使用fmod()。我到处都在寻找fmod(),包括javadocs,但找不到。我开始认为这是我必须创建的方法? 编辑:嗯,奇怪。我只是再次插入这些数字,它似乎工作正常……但以防万一。