如何打印浮点数到 n 位小数,包括后面的 0?

60 投票
5 回答
153858 浏览
提问于 2025-04-17 08:40

我需要把一个浮点数转换成15位小数的字符串,即使结果后面有很多零,比如:

1.6 变成 1.6000000000000000

我试过用 round(6.2, 15),但它返回的是 6.2000000000000002,这样就出现了舍入误差。

我还看到网上有很多人把浮点数放进字符串里,然后手动加上零,但这样看起来不太好……

有什么好的方法可以做到这一点吗?

5 个回答

5

浮点数在表示像“1.6”这样的数字时,精度不够,无法准确到那么多小数位。也就是说,四舍五入的误差是存在的。你的数字实际上并不是1.6。

可以看看这个链接: http://docs.python.org/library/decimal.html

17

在现代Python中(版本>=3.6),最简单的方法是使用f-string和字符串格式化

>>> var = 1.6
>>> f"{var:.16f}"
'1.6000000000000001'

如果你想“避免”最后的1,这个1出现在小数点后第15位,这是因为浮点数的工作方式,你可以先把float类型转换成字符串,然后再转换成Decimal类型:

>>> from decimal import Decimal
>>> f"{Decimal(str(var)):.16f}"
'1.6000000000000000'

需要注意的是,如果你处理的数字需要15位小数的精度,最好一开始就使用Decimal类型,而不是float类型。

82

适用于Python 2.6及以上版本和3.x版本

你可以使用 str.format 方法。下面是一些例子:

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

>>> print('{0:.15f}'.format(1.6))
1.600000000000000

注意,第一个例子最后的 1 是因为四舍五入的误差;这是因为要准确表示小数1.6需要无限个二进制位。由于浮点数的位数是有限的,所以这个数字被四舍五入到了一个接近但不完全相等的值。

适用于Python 2.6之前的版本(至少到2.0)

你可以使用“取模格式化”的语法(这在Python 2.6和2.7中也有效):

>>> print '%.16f' % 1.6
1.6000000000000001

>>> print '%.15f' % 1.6
1.600000000000000

撰写回答