10**-6 与 0.000001 - 只是表示方式吗?
在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 位小数,这个数字是根据浮点数能表示的极限随意设定的。
实际上,这两个值是完全相同的。这并不是理所当然的,因为浮点数的计算很容易引入小错误,毕竟浮点数只是用二进制分数来近似表示的。