以最Pythonic的方式打印*最多*几位小数

24 投票
3 回答
7421 浏览
提问于 2025-04-17 16:36

我想把一串浮点数格式化,最多保留两位小数。但是,我不想要后面的零,也不想要多余的小数点。

举个例子,4.001 应该变成 44.797 应该变成 4.88.992 应该变成 8.9913.577 应该变成 13.58

一个简单的解决办法是 ('%.2f' % f).rstrip('.0')('%.2f' % f).rstrip('0').rstrip('.')。但是,这看起来有点丑,而且似乎不太可靠。有没有更好的方法,或者一些神奇的格式标志可以用呢?

3 个回答

5

一般来说,处理字符串(String)可能会比较慢。不过,这里有另一种解决方案:

>>> from decimal import Decimal
>>> precision = Decimal('.00')
>>> Decimal('4.001').quantize(precision).normalize()
Decimal('4')
>>> Decimal('4.797').quantize(precision).normalize()
Decimal('4.8')
>>> Decimal('8.992').quantize(precision).normalize()
Decimal('8.99')
>>> Decimal('13.577').quantize(precision).normalize()
Decimal('13.58')

你可以在这里找到更多信息: http://docs.python.org/2/library/decimal.html

24

这个 g 格式化器会把输出限制在 n 个有效数字,并且会去掉后面的零:

>>> "{:.3g}".format(1.234)
'1.23'
>>> "{:.3g}".format(1.2)
'1.2'
>>> "{:.3g}".format(1)
'1'
21

你需要把 0. 的处理分开,这样你就不会把正常的 0 去掉了。

另外,你也可以使用 format() 函数,不过这其实和前面说的道理是一样的:

format(f, '.2f').rstrip('0').rstrip('.')

这里有一些测试:

>>> def formatted(f): return format(f, '.2f').rstrip('0').rstrip('.')
... 
>>> formatted(0.0)
'0'
>>> formatted(4.797)
'4.8'
>>> formatted(4.001)
'4'
>>> formatted(13.577)
'13.58'
>>> formatted(0.000000000000000000001)
'0'
>>> formatted(10000000000)
'10000000000'

撰写回答