Python 10**-6 vs 0.000001-只是一个表示还是?

Python 10**-6 vs 0.000001-只是一个表示还是?,python,math,Python,Math,在Python中,当我将10提高到负六次方时: >>> 10**-6 1e-06 它将显示1e-06 在解释器中显示的书写10**-6和0.000001之间是否存在明显差异?或者只是表示/格式上的差异。浮点永远不会有“精确性”,因此,虽然数字在逻辑上是相同的,但不能保证减去它们时会得到0.0,但由于舍入错误,可能会得到非常小的数字(例如1e-21) 至于如何打印,这是一个格式问题。要测试两个浮点值是否完全相等,只需使用=: >>> 0.000001 == 1

在Python中,当我将10提高到负六次方时:

>>> 10**-6
1e-06
它将显示1e-06

在解释器中显示的书写10**-6和0.000001之间是否存在明显差异?或者只是表示/格式上的差异。

浮点永远不会有“精确性”,因此,虽然数字在逻辑上是相同的,但不能保证减去它们时会得到
0.0
,但由于舍入错误,可能会得到非常小的数字(例如
1e-21


至于如何打印,这是一个格式问题。

要测试两个浮点值是否完全相等,只需使用
=

>>> 0.000001 == 10**-6
True
您可能会将表示与值混淆。Python使用
repr()
函数格式化一个
float
,当在解释器中回显时,它使用
g
符号格式化来表示值;当指数足够大时,此符号转换为使用科学表示法(
e
formatting)
repr()
实际上与
格式(值'.16g')
相同

您可以手动设置数字格式:

>>> format(10**-6, '.53f')
'0.00000099999999999999995474811182588625868561393872369'
>>> format(0.000001, '.53f')
'0.00000099999999999999995474811182588625868561393872369'
其中,
.53f
使用最多53个十进制数对值进行格式化,这是一个基于浮点值可以编码的限制的半任意数


事实上,这两个值完全相同。这不是既定的;浮点数计算很容易产生小错误,因为浮点数毕竟只是二进制分数的近似值。

FWIW为了说服自己,您可以使用查看对象的二进制表示:

>>> 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>'

如您所见,两个值都有相同的二进制表示。

是的,我知道。我的意思是,如果10**-6返回一个浮点,与我键入0.000001时的方式相同。我只是想知道控制台中1e-06的格式,以及它是否有任何意义。是的。非常感谢。我只是不确定解释器中的表示法是否意味着1e-06只是格式化/表示法,或者在数据类型和转换方面存在一些差异。您也可以使用Python的Decimal模块处理十进制定点和浮点对象。谢谢。我想这不是一个聪明的问题,我得到了-1:(.我编辑了我的问题以使其更有意义,删除了不是我问题重点的计算。@RichardKnop:随着你的问题的改变,我也得到了-1;我稍微更新了我的问题以更好地解决你的新版本。
struct.pack
也应该做这项工作