【问题标题】:How can I format a float to variable precision?如何将浮点数格式化为可变精度?
【发布时间】:2015-06-17 16:26:08
【问题描述】:

我想要一个将浮点数格式化为可变长度精度的函数。例如,如果我传入 n=2,我期望精度为 1.67;如果我传入n=5,我会期待1.66667

我目前有以下内容,但我觉得有一种更简单的方法可以做到这一点。有吗?

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

【问题讨论】:

  • 对我来说,您似乎已经回答了自己的问题。你在那里写的东西不起作用吗?
  • return '{:.{prec}f}'.format(x, prec=n) 稍微整洁一些,但不是很多!将% 格式与str.format 混合使用似乎很奇怪 - 请注意,您可以使用例如'{{:.{}f}}'.format(n) 转义大括号。
  • @DanGetz 我的解决方案有效,但我担心混合两种字符串格式。

标签: python


【解决方案1】:

在 2019 年使用 Python >= 3.6

从带有 PEP 498 的 Python 3.6 开始,您可以使用“f-strings”来像这样格式化

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

更多详情请参考这里:

【讨论】:

    【解决方案2】:

    你的解决方案很好。

    但是,就个人风格而言,我倾向于仅使用%,或仅使用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() 格式会如何正常工作。
    【解决方案3】:

    你可以直接使用这个:

    my_precision = lambda x, n: '{}'.format(round(x, n))
    

    【讨论】:

    • 请注意,round 返回一个float,因此仍然会受到精度问题的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多