Python 如何将浮点打印到小数点后n位,包括尾随的0?

Python 如何将浮点打印到小数点后n位,包括尾随的0?,python,floating-point,Python,Floating Point,我需要打印浮点数或将浮点数转换为15位小数字符串,即使结果有许多尾随的0,例如: 1.6变成1.600000000000000 我尝试了四舍五入(6.2,15),但它返回6.20000000000000002,并添加了一个四舍五入错误 我还看到很多人在网上把浮点数放到字符串中,然后手动添加尾随的0,但这看起来很糟糕 最好的方法是什么?对于2.6+和3.x中的Python版本 你可以使用这个方法。示例: >>> print('{0:.16f}'.format(1.6)) 1.60

我需要打印浮点数或将浮点数转换为15位小数字符串,即使结果有许多尾随的0,例如:

1.6变成1.600000000000000

我尝试了四舍五入(6.2,15),但它返回6.20000000000000002,并添加了一个四舍五入错误

我还看到很多人在网上把浮点数放到字符串中,然后手动添加尾随的0,但这看起来很糟糕

最好的方法是什么?

对于2.6+和3.x中的Python版本 你可以使用这个方法。示例:

>>> print('{0:.16f}'.format(1.6))
1.6000000000000001

>>> print('{0:.15f}'.format(1.6))
1.600000000000000
注意第一个示例末尾的
1
是舍入误差;这是因为十进制数1.6的精确表示需要无限个二进制数字。由于浮点数的位数是有限的,因此该数字会四舍五入到一个相近但不相等的值

对于2.6之前的Python版本(至少返回到2.0) 您可以使用“模格式”语法(这也适用于Python 2.6和2.7):


浮点数缺乏精确到小数点后1.6位的精度。舍入误差是真实的。你的号码实际上不是1.6


签出:

我想这本质上是把它放在一个字符串中,但这避免了舍入错误:

import decimal

def display(x):
    digits = 15
    temp = str(decimal.Decimal(str(x) + '0' * digits))
    return temp[:temp.find('.') + digits + 1]

现代Python
=3.6
中最简洁的方法是使用带有以下内容的f字符串:


请注意,最后2个并不是一个精确的舍入误差。与许多其他实数一样,数字6.2不能在计算机中用浮点变量精确表示。有关详细信息,请参阅和。@mtrw,我认为您可以将其称为舍入错误,因为输入被舍入到最接近的二进制数。+1。这个答案适用于>=Python 2.7。在Python2.6中,它将是
“{0:.16f}”。格式(x)
,但不确定旧版Python是否正确。@mtrw这是一个很好的观点。“模格式”(例如,
'%.16f“%1.6
)至少可以追溯到Python 2.0()。当我尝试上面的代码时,我遇到了一个奇怪的错误:
\error:ValueError:zero-length字段名格式为#
@jonathantopf您有哪个版本的Python?正如@mtrw在上面的一条评论中指出的,如果您有Python 2.6,那么您需要位置参数(该评论代码中的
0
)。如果您使用的是Python 3.0,这也是正确的。@mtrw I更新了答案,使用了位置参数,并为2.6版本之前的解释器添加了“模格式”。f字符串确实使这些事情变得更容易。
import decimal

def display(x):
    digits = 15
    temp = str(decimal.Decimal(str(x) + '0' * digits))
    return temp[:temp.find('.') + digits + 1]
>>> var = 1.6
>>> f"{var:.15f}"
'1.600000000000000'