python 中精度浮点数的损失



我有一个列表,叫做不同对数概率的分数。

当我调用此函数时:

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' .实际上,它搜索所有等效的字符串表示形式(使用相同基础浮点值存储的表示形式(并返回最短的表示形式。

最新更新