我用分裂试验了一种奇怪的行为。
some_nbr / 0 # >> ZeroDivisionError with 0 (Integer)
some_nbr / 0.0 # => NaN with 0.0 (Float)
当然,除以0是不好的,但是我想弄清楚为什么用Integer
进行除零会导致异常,而对浮点数进行相同操作只会返回Nan
。
整数0
正好为零;没有错误。并且由于除以零在数学上是未定义的,因此0
的整数除法会引发错误。
另一方面,浮动0.0
不一定恰好代表零。它可能源自一个数字,其绝对值足够小,可以舍入为零。在这种情况下,仍然定义了数学划分。当除数的绝对值很小时突然发出错误是没有意义的。然而,在这种情况下,由于值被舍入而无法再现有意义的值,因此最好能够理解的是返回某种伪数,例如NaN
。
NaN
和Infinity
是“有效”浮点值,在某种意义上,包含浮点数的内存地址可以表示这些值。这是红宝石采用的更为一般的IEEE standard的一部分。
相比之下,NaN
或Infinity
与整数没有有效的表示,因此抛出异常是恰当的。