我有一个列表,叫做不同对数概率的分数。
当我调用此函数时:
maxState = scores.pop(scores.index(max(scores)))
并打印maxState
,我意识到maxState
失去了作为浮点数的精度。有没有办法在不损失精度的情况下获得最大状态?
例如:我打印出列表分数:[-35.7971525669589, -34.67875545008369]
并打印maxState,我得到这个:-34.6787554501
(你可以看到它是四舍五入的(
您将字符串表示与实际内容混淆了。精度不会丢失,只有生成的用于写入控制台的字符串使用舍入值,而不是显示所有数字。并永远记住,浮点数是数字近似值,而不是精确值。
使用 str()
和 repr()
函数时,Python 浮点数的格式不同;在列表或其他容器中,使用 repr()
,但直接打印并使用str()
。
如果您不喜欢任一选项,请使用 format()
函数显式设置其格式并指定精度:
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()
输出旨在为您提供可往返的输出;请参阅Python 3.1关于float()
表示的更改说明,该说明向后移植到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'
.实际上,它搜索所有等效的字符串表示形式(使用相同基础浮点值存储的表示形式(并返回最短的表示形式。