带浮点数的字符串格式中的Python精度

带浮点数的字符串格式中的Python精度,python,string,floating-point,Python,String,Floating Point,我不明白为什么,通过格式化包含浮点值的字符串,最后一个值的精度没有得到尊重。即: '%f' % 38.2551994324 返回: '38.255199' (4个标志丢失!) 当时我解决了以下问题: '%.10f' % 38.2551994324 它会像预期的那样返回“38.2551994324”…但我真的应该手动强制输入我想要的十进制数吗?有没有一种方法可以简单地告诉python保存所有这些文件?!(例如,如果我不知道我的数字有多少个小数,我该怎么办?我会使用现代方法: 根据的规定,现在

我不明白为什么,通过格式化包含浮点值的字符串,最后一个值的精度没有得到尊重。即:

'%f' % 38.2551994324
返回:

'38.255199'
(4个标志丢失!)

当时我解决了以下问题:

'%.10f' % 38.2551994324
它会像预期的那样返回“38.2551994324”…但我真的应该手动强制输入我想要的十进制数吗?有没有一种方法可以简单地告诉python保存所有这些文件?!(例如,如果我不知道我的数字有多少个小数,我该怎么办?

我会使用现代方法:

根据

的规定,现在不推荐使用用于字符串格式设置的模方法,但是我真的应该手动强制输入我想要的十进制数吗?对

即使指定了10个十进制数字,您仍然无法打印所有数字。浮点数没有那种精度,它们大多是十进制数的近似值(它们实际上是二进制分数相加)。试试这个:

>>> format(38.2551994324, '.32f')
'38.25519943239999776096738060005009'
还有更多的小数,你甚至没有指定

格式化浮点数时(可以是
'%f'%number
'{:f}'。格式化(number)
格式化(number,'f')
),将显示默认的小数位数。这与在引擎盖下使用
str()
(或
'%s'%number
'{}.format(number)
format(number)
,基本上使用
str()
)时没有区别,只是默认情况下包含的小数位数不同;使用
str()
时,3.2之前的Python版本使用12位数字表示整数

如果您希望您的有理数计算能够使用特定、精确的位数,那么不要使用浮点数。请使用以下选项:

  • Decimal“基于浮点数模型,该模型是为人们着想而设计的,并且必然有一个至高无上的指导原则——计算机必须提供与人们在学校学习的算法相同的算法。”——摘自Decimal算术规范

  • 十进制数字可以精确表示。相反,像
    1.1
    2.2
    这样的数字在二进制浮点中没有精确的表示。最终用户通常不希望
    1.1+2.2
    显示为
    3.30000000000000003
    ,因为它使用二进制浮点


现在,您对浮点使用了默认的
str()
格式,该格式还具有默认的小数位数。如果您使用
'{:f}'
(或使用
格式(38.2551994324,'f')
,您会选择不同的默认值。doh!我真的很喜欢%语法:(@daveoncode,如果这对您有帮助,请随意接受并更新投票:)注意:PEP-3101中的弃用消息从未传播到Python代码库。Python版本一直到3.4(即将推出)仍然支持语法。我同意
format()
更好,并且有更多的功能,但是
%
字符串语法已经被取消。这不是
%
str.format()
(或
format()
)的关系,在任何情况下,因为当应用于浮点数时,两者的行为完全相同;要么使用
str()
,要么使用浮点格式(分别使用
%f
f
)。与38.2551994324最接近的IEEE 754 64位二进制文件的未舍入值为38。25519943239999776096738060005009174346923828125@MartijnPieters
>>0.6==0.60000000000000009
产生
True
。为什么这样?:D这是因为您提到的近似值?Python
3.7.2
@George所有浮点数都是使用二元分数的近似值。请参阅
>>> format(38.2551994324, '.32f')
'38.25519943239999776096738060005009'