如何打印浮点数到 n 位小数,包括后面的 0?
我需要把一个浮点数转换成15位小数的字符串,即使结果后面有很多零,比如:
1.6 变成 1.6000000000000000
我试过用 round(6.2, 15),但它返回的是 6.2000000000000002,这样就出现了舍入误差。
我还看到网上有很多人把浮点数放进字符串里,然后手动加上零,但这样看起来不太好……
有什么好的方法可以做到这一点吗?
5 个回答
5
浮点数在表示像“1.6”这样的数字时,精度不够,无法准确到那么多小数位。也就是说,四舍五入的误差是存在的。你的数字实际上并不是1.6。
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