如果不需要,Python3将保留小数位

2024-10-01 04:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python 3中看到了很多关于使用小数位数有限的格式设置浮点数的答案,例如:

>>> "{:.4f}".format(3.14159265359)
'3.1416'

但此格式将保留多余的尾随0:

>>> "{:.4f}".format(3/4)
'0.7500'

我想要的是以一种很好的方式删除尾随的零:

>>> "{:.4f??}".format(3/4)
'0.75'

使用g格式似乎更接近于此,但它将小数点前的数字作为总字段宽度的一部分进行计数,例如:

>>> "{:.4g}".format(3/4)
'0.75'

是完美的,但是:

>>> "{:.4g}".format(3.14159265359)
'3.142'

而不是所需的3.1416

为了澄清,整数(例如0本身)不应该有小数

单独使用format是否可以实现这一点,或者我是否必须通过对格式化数字进行字符串操作来删除尾随的零

我研究的文档页面(除了搜索网页):https://docs.python.org/3/library/string.html#formatspec


Tags: 字符串答案文档format宽度格式方式数字
3条回答

要将浮点转换为小数点后最多有N位但不包含尾随0的字符串,可以使用round()然后转换为字符串

>>> str(round(3.14159265359, 4))
'3.1416'
>>> str(round(3/4, 4))
'0.75'
>>> str(round(17, 4))
'17'

我在发布后发现的一个方法是:

print('{:.4f}.format(a).rstrip('.0') or '0')

我仍然想知道是否有可能更优雅

我不确定裸字符串格式是否可以实现这一点,但您可以:

>>> a = 3/ 4
>>> "{:.{a}f}".format(a, a=min(len(str(a).split('.')[-1]), 4))
'0.75'
>>> a = 3.14159265359
>>> "{:.{a}f}".format(a, a=min(len(str(a).split('.')[-1]), 4))
'3.1416'
>>> 

或者为什么不rstrip

>>> a = 3 / 4
>>> "{:.4f}".format(a).rstrip("0")
'0.75'
>>> a = 3.14159265359
>>> "{:.4f}".format(a).rstrip("0")
'3.1416'
>>> 

Numpy可以做得更好:

>>> import numpy as np
>>> np.format_float_positional(0.75, 4)
'0.75'
>>> np.format_float_positional(np.pi, 4)
'3.1416'
>>> 

相关问题 更多 >