The*_*nor 2 java floating-point double divide-by-zero
为什么要在Java中使用以下代码
System.out.println(new Integer(1)/ new Double(0));
Run Code Online (Sandbox Code Playgroud)
打印'无限'而不是未定义.这不是数学错误吗?
不,你不能在数学上除以零,但在Java中Infinity是正确的new Integer(1)/ new Double(0). new Integer(0)/ new Double(0)将是undefined(NaN).
Java遵循IEEE标准,因此对于诸如此类的浮点运算Infinity是正确的.如果是的话1/0,ArithmeticException就会发生,因为在整数除法中,不允许除零; int无穷无表示.
具体来说,在JLS中,第15.17.2节:
[I] f整数除法中除数的值为0,然后抛出ArithmeticException.
和
浮点除法的结果由IEEE 754算法的规则决定:
将零除以零导致NaN除以零的非零有限值导致有符号无穷大.
在数学中,有许多不同的结构支持算术.最突出的那些,例如自然数,整数和实数,不包括无穷大.在这些系统中,不支持除以零.
其他系统确实包括至少一个无穷大.例如,参见真实的投射线.它允许除以零.
只有一种方法可以知道在特定系统中数学定义或未定义的内容 - 研究该系统.
类似地,操作是否可交换(op b == b op a)和/或关联(op(b op c)==(a op b)op c)取决于系统和操作.
IEEE 754二进制浮点是具有有限元素集的系统,包括两个无穷大.加法和乘法都是可交换的,但不是联想的.Java实数和双重算术都是基于它的.Java语言规范是确定Java浮点算法中定义或未定义的唯一方法.
使用浮点的许多最差错误的基础是假设浮点数是实数,而不是有效但不同的系统.