如何将浮点数打印到 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?的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数格式化为 n 位小数

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

将浮点数舍入到 N 个小数位

如何舍入一个浮点数?

我们如何将浮点数拆分为整数和小数部分?

当 .toFixed(2) 小数点后为零时,如何将浮点数格式化为整数?