【问题标题】:Print either an integer or a float with n decimals打印一个整数或带有 n 个小数的浮点数
【发布时间】:2017-02-27 15:49:00
【问题描述】:

在 Python 中,当后一种情况需要我将打印输出限制为一定数量的数字时,如何打印可能是整数或实数类型的数字?

长话短说,假设我们有以下示例:

print("{0:.3f}".format(num)) # I cannot do print("{}".format(num))
                             # because I don't want all the decimals

是否有一种“Pythy”方式来确保例如如果num == 1 我打印1 而不是1.000 (我的意思是除了用if 语句使我的代码混乱)

【问题讨论】:

  • 部分问题在于int 对待.3 的方式与float 相同,而不是说完全忽略它。
  • 我猜不会,你至少需要在某个地方做一个三元运算符,我很确定你把它算作if

标签: python python-3.x floating-point int precision


【解决方案1】:

在 Python 3* 中,您可以只使用 round(),因为除了舍入 floats 之外,当应用于整数时,它总是会返回 int

>>> num = 1.2345
>>> round(num,3)
1.234
>>> num = 1
>>> round(num,3)
1

此行为记录在help(float.__round__):

Help on method_descriptor:

__round__(...)
    Return the Integral closest to x, rounding half toward even.
    When an argument is passed, work like built-in round(x, ndigits).

还有help(int.__round__):

Help on method_descriptor:

__round__(...)
    Rounding an Integral returns itself.
    Rounding with an ndigits argument also returns an integer.

* 对于 Python 2,round() 始终为 returns 和 float

【讨论】:

  • 我从来不知道round 如此多才多艺。我永远不会想到在int 上使用它。
  • 不确定它是否重要,但这不会给出与问题中格式规范相同的输出,但浮点值较短(即1.2 vs 1.200)。
  • @ekhumoro 是的,我同意目前还不太清楚期望的行为是什么,我对您的解决方案投了赞成票
  • @MarkRansom 谢谢,是的,事实上当 ndigits 是一个负整数时,整数上的round() 非常有用,例如round(210,-2) returns 200
【解决方案2】:

如果您需要为浮点值保持固定宽度,可以使用printf-style formatting,如下所示:

>>> num = 1
>>> print('%0.*f' % (isinstance(num, float) * 3, num))
1
>>> num = 1.2345
>>> print('%0.*f' % (isinstance(num, float) * 3, num))
1.234
>>> num = 1.2
>>> print('%0.*f' % (isinstance(num, float) * 3, num))
1.200

【讨论】:

    【解决方案3】:

    如果您使用固定数量的浮点数,您可以使用替换来删除多余的0。例如,这可以解决问题:

    print("{:.3f}".format(1).replace(".000", ""))
    

    【讨论】:

    • 效果很好,除非要求将1.0 显示为1.000
    【解决方案4】:

    固定小数点位数:

    >>> num = 0.2
    >>> print('%.04*f' % num)
    0.2000
    
    >>> num = 3.102
    >>> print('%.02*f' % num)
    3.10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多