具有浮点数的字符串格式的Python精度

时间:2013-12-14 17:16:54

标签: python string floating-point

我不明白为什么,通过格式化包含浮点值的字符串,不会遵守最后一个字符串的精度。即:

'%f' % 38.2551994324

返回:

'38.255199'

(失去了4个标志!)

目前我解决了指定:

'%.10f' % 38.2551994324

按预期返回'38 .2551994324'但是我应该手动强制我想要多少个十进制数?有没有办法简单告诉python保留所有这些?! (如果我不知道我的号码有多少小数,我该怎么办?)

2 个答案:

答案 0 :(得分:18)

但是我应该手动强制我想要多少个十进制数?是。

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

>>> format(38.2551994324, '.32f')
'38.25519943239999776096738060005009'

还有更多的小数,你甚至没有指定。

格式化浮点数时(使用'%f' % number'{:f}'.format(number)format(number, 'f')),会显示默认小数位数。这与使用str()(或'%s' % number'{}'.format(number)format(number)(基本上在引擎盖下使用str())时只有小数位数没有什么不同默认包括在内;使用str()时,3.2之前的Python版本使用12位作为整数

如果您希望有理数计算使用特定的,精确的位数,则不要使用浮点数。改为使用decimal.Decimal type

  
      
  • 十进制“基于一个浮点模型,它是为人们设计的,并且必然具有最重要的指导原则 - 计算机必须提供与人们学习的算法相同的算法学校。“ - 摘自十进制算术规范。

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

  •   

答案 1 :(得分:3)

我会使用现代str.format()方法:

>>> '{}'.format(38.2551994324)
'38.2551994324'

字符串格式的模数方法现已根据PEP-3101

弃用