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

dav*_*ode 10 python string floating-point

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

'%f' % 38.2551994324
Run Code Online (Sandbox Code Playgroud)

收益:

'38.255199'
Run Code Online (Sandbox Code Playgroud)

(4个标志丢失了!)

目前我解决了指定:

'%.10f' % 38.2551994324
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 18

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

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

>>> format(38.2551994324, '.32f')
'38.25519943239999776096738060005009'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 十进制数字可以准确表示.相反,数字喜欢1.12.2不具有二进制浮点的精确表示.最终用户通常不希望1.1 + 2.2显示3.3000000000000003二进制浮点数.

  • 最接近的IEEE 754 64位二进制值到38.2551994324的未舍入值是38.25519943239999776096738060005009174346923828125 (3认同)