[英]Loss of precision float in python
我有一个叫做分数变化对数概率的列表。
当我调用此函数时:
maxState = scores.pop(scores.index(max(scores)))
并打印maxState
,我意识到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()
输出的目的是让你圆trippable输出; 请参阅float()
表示形式上的Python 3.1更改说明 ,该说明已反向移植到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'
。 有效地,它搜索所有等效的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.