在python中丢失精度浮点数

时间:2014-10-18 16:07:48

标签: python

我有一个名为不同的-log概率分数的列表。

当我调用此函数时:

maxState = scores.pop(scores.index(max(scores)))

并打印maxState,我意识到maxState失去了它作为浮点数的精度。有没有办法可以获得maxState而不会失去精度?

例如:我打印出列表分数​​:[-35.7971525669589, -34.67875545008369] 并打印maxState,我明白了:-34.6787554501 (你可以看到它是圆形的)

1 个答案:

答案 0 :(得分:4)

您将字符串演示与实际内容混淆。精确丢失的地方,只有用于写入控制台的字符串使用舍入值而不是显示所有数字。并且始终记住浮点数是数字近似值,而不是精确值。

使用str()repr()函数时,Python浮点数的格式不同;在列表或其他容器中,使用repr(),但直接打印并使用str()

如果您不喜欢任何一个选项,请使用format() function明确格式化并指定精度:

print format(maxState, '.12f')
例如,

以8位小数打印它。

演示:

>>> maxState = -34.67875545008369
>>> repr(maxState)
'-34.67875545008369'
>>> str(maxState)
'-34.6787554501'
>>> format(maxState, '.8f')
'-34.67875545'
>>> format(maxState, '.12f')
'-34.678755450084'

repr()输出大致相当于使用'.17g'作为格式,而str()相当于'.12g';这里的精度表示何时使用科学记数法(e)以及何时以浮点表示法(f)显示。

我说粗略因为repr()输出旨在为您提供圆形输出;请参阅change notes for Python 3.1 on float() representation,其中向后移植到Python 2.7:

  

新功能是如何显示数字。以前,Python使用了一种简单的方法。 repr(1.1)的值计算为format(1.1, '.17g'),评估为'1.1000000000000001'。使用17位数字的优点是它依靠IEEE-754保证确保eval(repr(1.1))完全往返到其原始值。缺点是许多人发现输出混乱(将二进制浮点表示的内在限制误认为是Python本身的问题)。

     

repr(1.1)的新算法更智能,并返回'1.1'。实际上,它会搜索所有等效的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式)并返回最短的表示形式。