如何将浮点数打印到小数点后 n 位(包括尾随的 0)?
- 2025-02-20 09:25:00
- admin 原创
- 24
问题描述:
我需要打印或转换浮点数为 15 位小数字符串,即使结果有许多尾随 0,例如:
1.6 变成 1.6000000000000000
我尝试了 round(6.2,15),但它返回 6.2000000000000002,增加了舍入误差
我还看到网上很多人将浮点数放入字符串,然后手动添加尾随 0,但这似乎很糟糕......
做到这一点的最好方法是什么?
解决方案 1:
适用于 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 的精确表示需要无限数量的二进制数字。由于浮点数的位数有限,因此该数字被舍入为接近但不相等的值。
对于 2.6 之前的 Python 版本(至少回到 2.0)
您可以使用“模数格式化”语法(这也适用于 Python 2.6 和 2.7):
>>> print '%.16f' % 1.6
1.6000000000000001
>>> print '%.15f' % 1.6
1.600000000000000
解决方案 2:
现代 Python 中最干净的方法是使用具有字符串格式的>=3.6
f 字符串:
>>> var = 1.6
>>> f"{var:.16f}"
'1.6000000000000001'
如果想要“避免”最后一个1
(由于浮点数的工作方式,它出现在小数点后第 15 位),您可以将float
第一个 转换为字符串表示形式,然后转换为Decimal
:
>>> from decimal import Decimal
>>> f"{Decimal(repr(var)):.16f}"
'1.6000000000000000'
请注意,如果您处理的数字需要 15 位小数的精度,那么您float
首先就不应该使用 s,而应该Decimal
从一开始就围绕 s 构建解决方案。
解决方案 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'
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD