以最Pythonic的方式打印*最多*几位小数
我想把一串浮点数格式化,最多保留两位小数。但是,我不想要后面的零,也不想要多余的小数点。
举个例子,4.001
应该变成 4
,4.797
应该变成 4.8
,8.992
应该变成 8.99
,13.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'