使用n位小数打印整数或浮点数

9
在Python中,如何打印一个可能是整数或实数类型的数字,当后者需要我将打印限制在一定数量的位数时?
简而言之,假设我们有以下示例:
print("{0:.3f}".format(num)) # I cannot do print("{}".format(num))
                             # because I don't want all the decimals

有没有一种“Pythonic”的方式来确保在例如num == 1的情况下,我打印1而不是1.000(我的意思是除了用if语句使我的代码变得混乱之外)


问题的一部分在于 int 对待 .3 的方式与 float 相同,而不是完全忽略它。 - Mad Physicist
我的猜测是不行的,你至少需要在某个地方使用三目运算符,我很确定你会将其视为“if”。 - Mad Physicist
4个回答

10

使用 Python 3*,您可以直接使用 round()。除了舍入float外,当应用于整数时,它总是返回一个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() 总是返回一个 float 值。


1
我从未意识到 round 如此多才多艺。我从未想过在 int 上使用它。 - Mark Ransom
不确定是否重要,但是这个代码与问题中的格式规范在较短的浮点数值(即 1.2 vs 1.200)方面输出结果不同。 - ekhumoro
@ekhumoro 是的,我同意那里想要的行为不太清楚,我已经给你的解决方案点赞了。 - Chris_Rands
@MarkRansom 谢谢,没错,实际上当 ndigits 是一个负整数时,对整数使用 round() 函数是非常有用的。例如 round(210,-2) 会返回 200 - Chris_Rands

6
如果您需要为浮点值保持固定宽度,可以使用printf样式的格式化,像这样:
>>> 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
除非要求将 1.0 显示为 1.000,否则效果很好。 - Mark Ransom

0

对于固定小数点位数:

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

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

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