10**-6 与 0.000001 - 只是表示方式吗?

3 投票
3 回答
20923 浏览
提问于 2025-04-18 18:10

在Python中,当我把10的负六次方计算出来时:

>>> 10**-6
1e-06

它会显示成1e-06。

那么,写成10**-6和0.000001在解释器中显示出来有什么明显的区别吗?还是说这只是表示方式或格式上的不同呢?

3 个回答

1

浮点数从来没有“完全准确”的说法,所以虽然这些数字在逻辑上是相同的,但你不能保证在相减的时候一定会得到 0.0,可能会得到一个非常小的数字(比如 1e-21),这是因为四舍五入的误差。

至于它是怎么显示的,那是一个格式化的问题。

3

为了让你更相信这一点,你可以使用 marshal模块 来查看这个对象的二进制表示:

>>> import marshal
>>> marshal.dumps(10**-6)
'g\x8d\xed\xb5\xa0\xf7\xc6\xb0>'
>>> marshal.dumps(0.000001)
'g\x8d\xed\xb5\xa0\xf7\xc6\xb0>'

正如你所看到的,这两个值有着相同的 二进制表示

6

要测试两个浮点数是否完全相等,只需要用 == 来比较:

>>> 0.000001 == 10**-6
True

你可能把表示方式数值搞混了。Python 在解释器中显示一个 float 时,会用 repr() 函数来格式化它,这个函数会用 g 这种表示法来显示数值;当指数足够大时,它会切换到科学计数法(e 格式)。repr() 实际上和 format(value, '.16g') 是一样的。

你也可以手动格式化这些数字:

>>> format(10**-6, '.53f')
'0.00000099999999999999995474811182588625868561393872369'
>>> format(0.000001, '.53f')
'0.00000099999999999999995474811182588625868561393872369'

其中 .53f 表示将数值格式化为最多 53 位小数,这个数字是根据浮点数能表示的极限随意设定的。

实际上,这两个值是完全相同的。这并不是理所当然的,因为浮点数的计算很容易引入小错误,毕竟浮点数只是用二进制分数来近似表示的。

撰写回答