我需要将浮点数打印或转换为15位小数的字符串,即使结果有许多尾随的0,例如:
1.6 变成 1.6000000000000000
我尝试了 round(6.2,15),但它返回 6.2000000000000002 并添加了一个舍入误差。
我也看到在线上有很多人将浮点数放入字符串中,然后手动添加尾随0,但那似乎不太好……
那么,最好的方法是什么呢?
我需要将浮点数打印或转换为15位小数的字符串,即使结果有许多尾随的0,例如:
1.6 变成 1.6000000000000000
我尝试了 round(6.2,15),但它返回 6.2000000000000002 并添加了一个舍入误差。
我也看到在线上有很多人将浮点数放入字符串中,然后手动添加尾随0,但那似乎不太好……
那么,最好的方法是什么呢?
您可以使用 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.7):
>>> print '%.16f' % 1.6
1.6000000000000001
>>> print '%.15f' % 1.6
1.600000000000000
'{0:.16f}'.format(x)
,但旧版本Python的情况不确定。 - mtrwprint '{0:.15f}'.format(600.2)
,你会注意到右边已经出现了非零数字,而且你的数字越大,小数部分中就会看到更多的“噪音”。如果你真的关心保持15位精度,请参考我的关于使用decimal
模块的答案。 - dkamins在现代的 Python >=3.6
中,最清晰的方法是使用带有字符串格式化的 f-string:
>>> var = 1.6
>>> f"{var:.15f}"
'1.600000000000000'
format()
来打印小数点后的数字。摘自http://docs.python.org/tutorial/floatingpoint.html。>>> format(math.pi, '.12g') # give 12 significant digits
'3.14159265359'
>>> format(math.pi, '.2f') # give 2 digits after the point
'3.14'
>>> f'{1.23456:.12g}' '1.23456'
- KeithB我猜这本质上是把它放在一个字符串中,但这样可以避免四舍五入误差:
import decimal
def display(x):
digits = 15
temp = str(decimal.Decimal(str(x) + '0' * digits))
return temp[:temp.find('.') + digits + 1]