python中的精度浮点损失

python中的精度浮点损失,python,Python,我有一个叫做“变化对数概率分数”的列表 当我调用此函数时: maxState = scores.pop(scores.index(max(scores))) 打印maxState,我意识到maxState会失去其浮点精度。有没有一种方法可以在不损失精度的情况下获取maxState 例如:我打印出列表分数:[-35.7971525669589,-34.67875545008369] 然后打印maxState,我得到这个:-34.6787554501 (您可以看到它是四舍五入的)您将字符串表示与实

我有一个叫做“变化对数概率分数”的列表

当我调用此函数时:

maxState = scores.pop(scores.index(max(scores)))
打印
maxState
,我意识到
maxState
会失去其浮点精度。有没有一种方法可以在不损失精度的情况下获取maxState

例如:我打印出列表分数:
[-35.7971525669589,-34.67875545008369]
然后打印maxState,我得到这个:
-34.6787554501

(您可以看到它是四舍五入的)

您将字符串表示与实际内容混淆了。精度没有损失,只有写入控制台的字符串使用舍入值,而不是显示所有数字。永远记住,浮点数是数字近似值,而不是精确值

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

如果您不喜欢这两个选项中的任何一个,请使用并指定精度显式设置其格式:

print format(maxState, '.12f')
例如,用8位小数打印

演示:

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

我之所以这样说是因为
repr()
输出的目的是为您提供四舍五入的trippable输出;请参阅,其中后端口为Python 2.7:

新的是数字的显示方式。以前,Python使用一种简单的方法。
repr(1.1)
的值被计算为
格式(1.1,.17g')
,计算结果为
'1.10000000000001'
。使用17位数字的优势在于,它依赖IEEE-754保证,以确保
eval(repr(1.1))
将精确往返到其原始值。缺点是许多人发现输出令人困惑(误认为二进制浮点表示的固有限制是Python本身的问题)

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


您将字符串表示与实际内容混淆。精度没有损失,只有写入控制台的字符串使用舍入值,而不是显示所有数字。永远记住,浮点数是数字近似值,而不是精确值

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

如果您不喜欢这两个选项中的任何一个,请使用并指定精度显式设置其格式:

print format(maxState, '.12f')
例如,用8位小数打印

演示:

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

我之所以这样说是因为
repr()
输出的目的是为您提供四舍五入的trippable输出;请参阅,其中后端口为Python 2.7:

新的是数字的显示方式。以前,Python使用一种简单的方法。
repr(1.1)
的值被计算为
格式(1.1,.17g')
,计算结果为
'1.10000000000001'
。使用17位数字的优势在于,它依赖IEEE-754保证,以确保
eval(repr(1.1))
将精确往返到其原始值。缺点是许多人发现输出令人困惑(误认为二进制浮点表示的固有限制是Python本身的问题)

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


@弗拉夫:把浮点值放在一个容器中,复制起来很简单。是的,我忘了实际使用“print”@弗拉夫:把浮点值放在一个容器中,复制起来很简单。是的,我忘了在你的
浮点符号(f)
中实际使用“print”小注释。在文档中定义为固定点:
固定点。将数字显示为定点数字。默认精度为6
。请参阅:
浮点表示法(f)
的次要注释。在文档中定义为固定点:
固定点。将数字显示为定点数字。默认精度为6
。见: