被0和0.00除

1 投票
3 回答
2361 浏览
提问于 2025-04-17 16:42

JavaScript

0/0       // NaN
0/0.0     // NaN
1/0.0     // Infinity
1/0.0     // Infinity

Ruby

>> 0/0     # ZeroDivisionError: divided by 0
>> 0/0.00  # NaN
>> 1/0.00  # Infinity
>> -1/0.00 # -Infinity

Python

>>> 0/0    # ZeroDivisionError: integer division or modulo by zero
>>> 0/0.0  # ZeroDivisionError: integer division or modulo by zero
>>> 1/0.0  # ZeroDivisionError: integer division or modulo by zero
>>> -1/0.0 # ZeroDivisionError: integer division or modulo by zero

为什么整数不能被零除,而浮点数可以呢?

还有在Python中,为什么不是出现NaN(不是一个数字)或无穷大,而是所有的错误呢?

3 个回答

1

在Python中,为什么它不是NaN(不是一个数字)或无穷大,而是所有的错误呢?

在Python的某些模块中,确实会有这种情况,当它们合适的时候:

In [1]: import numpy as np

In [2]: a = np.arange(3)

In [3]: b = np.ones(3)

In [4]: b/a
Out[4]: array([ inf,  1. ,  0.5])
2

不同的编程语言有不同的选择。

以JavaScript为例,它把整数当作浮点数来存储,并且在除法运算时遵循IEEE-754的规则。

Python则不允许用00.0进行除法运算。想了解如何绕过这个限制,可以查看这个问题

Ruby区分了精确的0和像0.0(或-0.0)这样的浮点数。实际上,0.0可以表示一个非常小的正数,这个数在浮点数的精度范围内无法表示(例如0.1e-400)。从这个角度来看,1/0.1e-400会返回Float::INFINITY,因为1e401太大,无法用其他浮点数表示。

Ruby实际上有两个不同的比较运算符来区分这两者:

0 == 0.0 # => true
0.eql?(0.0) # => false

这可能会带来一些重要的后果:

h = {0 => :foo}
h[0.0] # => nil
3

浮点数除以零在很多环境中可能会引发异常(如果这个功能被开启的话),但因为IEEE浮点数可以表示一些特殊的值(比如Inf表示无穷大,Nan表示不是一个数字),所以除以零也有可能返回一个特殊的,而整数运算是做不到这一点的。

你还会发现不同编程语言在解析(或者说提升数据类型?)时的表现不同。不过,在JavaScript中,单独的0是浮点数0,而不是整数0。

撰写回答