如何将浮点数格式化为可变精度的变量?

13

我希望有一个函数,可以将浮点数格式化为可变长度的精度。例如,如果我传入n=2,我希望精度为1.67;如果我传入n=5,我希望得到1.66667

目前我有以下代码,但是我感觉应该有更简单的方法来实现。有吗?

def my_precision(x, n):
    fmt = '{:.%df}' % n
    return fmt.format(x)

在我看来,你似乎已经回答了自己的问题。你写的那个方法不起作用吗? - Dan Getz
1
return '{:.{prec}f}'.format(x, prec=n) 稍微整洁一些,但差别不大!混合使用 % 格式化和 str.format 看起来非常奇怪 - 请注意,您可以使用例如 '{{:.{}f}}'.format(n) 来转义大括号。 - jonrsharpe
@DanGetz 我的解决方案可行,但我担心混合使用字符串格式化。 - drincruz
3个回答

19

在2019年及以后的Python版本中(Python >= 3.6)

从Python 3.6及其以上版本的PEP 498开始,您可以使用"f-strings"来格式化字符串,如下所示

>>> x = 123456
>>> n = 3
>>> f"{x:.{n}f}"
'123456.000'

更多细节请参考:


11

你的解决方案很好。

然而,就个人风格而言,我倾向于仅使用%或仅使用str.format()

因此,在这种情况下,我会将你的格式化函数定义为:

def my_precision(x, n):
    return '{:.{}f}'.format(x, n)

(感谢 @MarkDickinson 提供了一个比 '{{:.{:d}f}}'.format(n).format(x) 更简短的替代方案)


顺便提一下,你可以直接这样做:

my_precision = '{:.{}f}'.format

它有效:

>>> my_precision(3.14159, 2)
'3.14'

:-)


@mescalinum 谢谢,我也不喜欢混合格式,而且我也不确定只使用 str.format() 是否能正确处理格式。 - drincruz

-1
你可以直接使用这个:
my_precision = lambda x, n: '{}'.format(round(x, n))

3
注意,round 返回一个浮点数,因此仍可能受到精度问题的影响。 - jonrsharpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接