如何将浮点数打印到 n 位小数,包括尾随 0?
Posted
技术标签:
【中文标题】如何将浮点数打印到 n 位小数,包括尾随 0?【英文标题】:How to print float to n decimal places including trailing 0s? 【发布时间】:2011-12-19 22:10:51 【问题描述】:我需要将浮点数打印或转换为小数点后 15 位的字符串,即使结果有很多尾随 0,例如:
1.6 变成 1.6000000000000000
我尝试了 round(6.2,15) 但它返回 6.2000000000000002 添加一个舍入错误
我还看到网上有很多人将浮点数放入一个字符串中,然后手动添加尾随 0,但这似乎很糟糕......
最好的方法是什么?
【问题讨论】:
旁注,但最后 2 并不是精确的舍入错误。数字 6.2 与许多其他实数一样,不能用计算机中的浮点变量精确表示。请参阅docs.python.org/tutorial/floatingpoint.html 和***.com/questions/1089018/… 了解更多信息。 @mtrw,我认为您可以称其为舍入错误 - 输入被舍入为最接近的二进制数。 【参考方案1】:适用于 2.6+ 和 3.x 中的 Python 版本
您可以使用str.format
方法。例子:
>>> 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):
>>> print '%.16f' % 1.6
1.6000000000000001
>>> print '%.15f' % 1.6
1.600000000000000
【讨论】:
+1。这个答案适用于 >= Python 2.7。在 Python 2.6 中,它将是'0:.16f'.format(x)
,不确定是否是旧版 Python。
@mtrw 好点。 “模格式”(例如,'%.16f' % 1.6
)至少可以追溯到 Python 2.0(Python 2.0 String Formatting Operations)。
我在尝试上面的代码时遇到了一个奇怪的错误:# Error: ValueError: zero length field name in format #
@jonathantopf 你有哪个版本的 Python?正如@mtrw 在上面的评论中指出的那样,如果您有 Python 2.6,则需要位置参数(该评论代码中的 0
)。如果你有 Python 3.0,这也是正确的。
@mtrw 我更新了答案以使用位置参数并包括 2.6 之前的解释器的“模格式”。【参考方案2】:
现代 Python >=3.6
中最简洁的方法是使用带有 string formatting 的 f 字符串:
>>> var = 1.6
>>> f"var:.15f"
'1.600000000000000'
【讨论】:
【参考方案3】:浮点数缺乏精确度,无法将“1.6”精确表示到小数位数。舍入误差是真实的。你的数字实际上不是 1.6。
查看:http://docs.python.org/library/decimal.html
【讨论】:
【参考方案4】:我猜这本质上是把它放在一个字符串中,但这避免了舍入错误:
import decimal
def display(x):
digits = 15
temp = str(decimal.Decimal(str(x) + '0' * digits))
return temp[:temp.find('.') + digits + 1]
【讨论】:
【参考方案5】:我们可以使用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'
【讨论】:
以上是关于如何将浮点数打印到 n 位小数,包括尾随 0?的主要内容,如果未能解决你的问题,请参考以下文章