【问题标题】:Arithmetic Exception: / by zero only works on integers in Java算术异常:/ by zero 仅适用于 Java 中的整数
【发布时间】:2014-09-12 18:26:04
【问题描述】:

为什么数字除以零会有如此不同的答案:

我的代码:

class Test {
  public static void main(String[] args){

    int a = (int)(3/0.0F);
    System.out.println(a);

    System.out.println(3/0.0F);

    System.out.println(3/0);
  }
}

输出:

2147483647
Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero

每次我将一个数字除以一个整数(字节、短整数、整数、长整数)时,它都会抛出 ArithmeticException,而在处理实数(浮点数、双精度数)时情况并非如此。为什么?

【问题讨论】:

  • 因为浮点被设计为在这种情况下返回 NaN。这是一个带外值。整数没有带外值,因此需要例外。
  • 如果你不知道 OP - NaN 代表“非数字”。
  • 您知道,2147483647 输出是因为您将无穷大(如下一个输出所示)转换为整数,因此它将继续滚动整数范围并最终取最大可能值(2^31-1 或 2147483647)
  • @HimanshuAggarwal JLS #5.1.3:"这个值一定是太大了(一个很大的正值或者正无穷大),第一步的结果是int或者long类型的最大可表示值。”
  • @EJP 有限数除以零不会产生 NaN,而是浮点数的无穷大。只有 0.0/0.0 产生 NaN。

标签: java exception casting floating-point integer


【解决方案1】:

来自JLS §15.17.2

  • 非零有限值除以零会产生有符号无穷大。标志由上述规则确定。

除了:

如果整数除法中除数的值为0,则 引发 ArithmeticException。

【讨论】:

  • 显而易见的问题是“为什么他们编写规范时不将浮点数和整数算术一致?”
  • @mikez 显而易见的答案是“IEEE 754”,并且由于没有整数NaN.,因此缺乏实现整数的方法
猜你喜欢
  • 2020-05-24
  • 2022-11-17
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多