下面的语句抛出java.lang.ArithmeticException: / by zero
那样明显。
System.out.println(0/0);
因为字面0
被认为是一个int
由零字面和除法在整数运算是不允许的。
下面的案例却不会引发像任何异常java.lang.ArithmeticException: / by zero
。
int a = 0;
double b = 6.199;
System.out.println((b/a));
它显示Infinity
。
下面的语句产生NaN
,没有例外(非数字)。
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.
在这种情况下,两个操作数被认为是双。
同样,以下语句不抛出任何异常。
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
)...
总之,这就是它在IEEE-754标准,这是Java的指定方式浮点运算的基础上。
为什么不通过零(或溢出或下溢)部门停止该程序或触发一个错误? 为什么在数字的标准包括“不是一个数字”(NAN)?
754模式鼓励健壮的程序。 它的目的不仅是数字的分析师也为用户的电子表格,数据库系统,甚至是咖啡壶。 为NaN和无穷的传播规则允许无关紧要的例外消失。 同样地,渐进下溢在精确的范围内保持误差特性。
当特殊情况需要注意,他们可以立即通过陷阱或通过状态标志方便的时候检查。 陷阱可以用来停止程序,但无法恢复的情况是极其罕见的。 简单地停止一个程序不是针对嵌入式系统或网络代理的选项。 更多的时候,陷阱记录诊断信息或替代有效的结果。
旗同时提供可预测的控制流量和速度。 它们的使用需要程序员知道的得天独厚的条件,但标志粘性允许程序员推迟处理异常情况,直到必要的。
这是这样,因为这是IEEE 754如何被定义的。
除以一个浮点0.0产生NaN或+/- Inf文件,这取决于分子是否是0。
除以整数0不是由IEEE 754所覆盖,并且产生一个异常-有指示,因为错误的没有别的办法int
不能代表NaN
或Inf
。
生成异常是类似于(软件) INT
由分割在x86微处理器产生由零。
超越无限
class DoubleDivision {
public static void main(String[] args) {
System.out.println(5.0/0.0);
}
}
上面的代码,你所提到的片断给人infinity
。
为什么Java使用Double
s到代表小数。 二进制不能完全代表一个数字,它只能代表一个近似值,因此,无论是能Java的两倍。
想象一下,一个令人难以置信的数量接近零。 如果你知道微积分,在零想象极限。 变量将趋近于零一些被假设的微小距离,但绝不等于完全吻合。 你可以想象一下,对不对? 好吧,假设这个数字是需要这么多精密的Java来表示,它放弃,并调用它0.0
,因为它并没有一个很好的选择。 这就是发生在这里。 由超近数除以零任何正规数基本上是无穷大 。 尝试: 5 / (10^-100)
也请参见: 特殊浮点值的数学错误更多信息:)
相关的问题: 为什么1/0给予错误,但1.0 / 0/0给予INF
UPDATE: INT
没有一个无穷大和NaN
,而浮动确实有无限和设定值NaN
价值。 (根据IEEE 754个标准的如下的java)
当存在由零的鸿沟,计算机不能创建该结果作为数的表示。 该计算机需要表明的结果是不是数字。
对于浮点值可以产生一种特殊的不非数字标记值,因为有一些32位(对于float
)和64位(对于double
)位模式不表示一个数目,并且因此可以被解释作为不非数值( NaN
)。
对于使用普通二进制补码方案(如Java要求)的整数值,所有32位(对于int
)和64位(对于long
)位模式代表一个数字。 因此,使用定点计算机无法报告问题。 它必须以某种方式将问题报告“带外”。 抛出异常是选择出来的Java带方法。
爪哇遵循IEEE 754标准定义的值被零在分割的情况下默认返回。 http://en.wikipedia.org/wiki/IEEE_754#Exception_handling
除零(有限操作数的运算给出一个确切的无限结果,例如,1/0或日志(0))(±返回默认无穷大)。
import java.util.Scanner;
public class Division {
public static void main(String[] args) {
int a, b;
float result;
Scanner input = new Scanner(System.in);
System.out.println("Enter value for a : ");
a = input.nextInt();
System.out.println("Enter value for b : ");
b = input.nextInt();
try {
/* here we used "if clause" because result will be in float
note: Here result is in float, so JVM Cant Catch Exception.
if we Try to Divide with Zero with Float Values It gives Output as
Divided by Zero is Infinity */
if (b != 0) {
result = (float) a / b;
System.out.println("Result of " + a + " divided by " + b + " is : " + result);
} else // here result will be in integer so Jvm can easily Catch The Exception
{
result = a / b;
}
} catch (ArithmeticException e) {
System.out.println("Sorry Division By Zero Is Not Possible");
}
}
}
/* Ouput :
Enter value for a :2
Enter value for b : 7
Result of 2 divided by 7 is : 0.2857143 */
/* Ouput :
Enter value for a : 16
Enter value for b : 0
Sorry Division By Zero Is Not Possible */
文章来源: Why does division by zero with floating point (or double precision) numbers not throw java.lang.ArithmeticException: / by zero in Java