logo

除以0

入门。

数学课上我们都学过,0 不能做分母。在编程语言中这条规则仍然适用,但程序的反应缺稍有不同:

整数除以整数 0

比如 1/0,那必须是不可以的,程序应该报错

Java:

jshell> 1 / 0
|  java.lang.ArithmeticException thrown: / by zero
|        at (#4:1)

Python:

>>> 1 / 0
...
ZeroDivisionError: division by zero

分子或分母为浮点数

比如 1.0/0,或 1/0.0,或 1.0/0.0。

0.0 会被当做一个极小的数,无限趋近于 0,所以除的结果是无穷大

Java:

jshell> 1.0 / 0.0
$1 ==> Infinity

Python 会抛一个稍微不同的错。也说得过去。

>>> 1.0 / 0.0
...
ZeroDivisionError: float division by zero

0.0 / 0.0

Python 会给出同样的 ZeroDivisionError,但 Java 不抛错,返回的是 NaN,即 Not-a-Number

jshell> 0.0 / 0.0
$1 ==> NaN

放弃?

到目前为止一切合乎逻辑。直到...

JavaScript 整数除以 0 返回的是无穷大

> 12 / 0
Infinity

因为...javascript 就没有整数,都被当做浮点数处理。

还记得 Java 会返回 Infinity 么?如果把它强制转换为 int,它就成了 2147483647

jshell> 1/0.0
$1 ==> Infinity

jshell> (int)(1/0.0)
$2 ==> 2147483647

jshell> (int)Double.POSITIVE_INFINITY
$3 ==> 2147483647

jshell> (int)Double.POSITIVE_INFINITY==Integer.MAX_VALUE
$4 ==> true

PHP/Hack 会给出一个 Warning,但返回的是...false

hphpd> = 12 / 0

Warning: Division by zero
false

进阶!

C/C++里除以 0 是没有被定义的,什么事情都可能发生...