最具python风格的打印方式*最多*小数位数
我想格式化一个浮点数列表,最多,比如说,小数点后两位。但是,我不想要尾随的零,也不想要尾随的小数点 例如,最具python风格的打印方式*最多*小数位数,python,floating-point,string-formatting,Python,Floating Point,String Formatting,我想格式化一个浮点数列表,最多,比如说,小数点后两位。但是,我不想要尾随的零,也不想要尾随的小数点 例如,4.001=>4,4.797=>4.8,8.992=>8.99,13.577=>13.58 简单的解决方案是('%.2f'%f.).rstrip('.0')('.2f'%f.).rstrip('.0').rstrip('.'))。但是,这看起来相当丑陋,似乎很脆弱。是否有更好的解决方案,可能带有一些神奇的格式标志?您需要将0和剥离分开;这样你就永远不会剥夺自然的0 或者,使用format()
4.001
=>4
,4.797
=>4.8
,8.992
=>8.99
,13.577
=>13.58
简单的解决方案是
('%.2f'%f.).rstrip('.0')
('.2f'%f.).rstrip('.0').rstrip('.')
)。但是,这看起来相当丑陋,似乎很脆弱。是否有更好的解决方案,可能带有一些神奇的格式标志?您需要将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'
g
格式化程序将输出限制为n
有效数字,删除尾随的零:
>>> "{:.3g}".format(1.234)
'1.23'
>>> "{:.3g}".format(1.2)
'1.2'
>>> "{:.3g}".format(1)
'1'
通常,使用字符串[s]可能会很慢。 然而,这是另一种解决方案:
>>> 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')
你可以在这里找到更多信息:我是否错过了这里的要点,或者
round()
函数如何:不过,我不得不说,我不太喜欢涉及round
的解决方案,只是因为我紧张,总有一天我会得到1.10000000009962
作为输出。啊,这不是重复!我不想要拖尾.0
。另一个问题允许这样做。@nneonneo我相信int()
会去掉.0
,但要小心使用,因为它会去掉任何其他小数位数(所以可能是if/else语句?)@Haidro:…现在这太令人讨厌了。我希望我不需要一个if/else
,或者我只需要一个。%2f“%f
或其他条件。(仍然很难找到一个好的解决方案……我真的习惯了Python中非常简单的东西)如果您只有一个{}
模板,那么就可以使用。e、 g.格式(f,.3g')
。这甚至适用于0。几乎…除了它最多打印三位数字,而不是最多两位小数。(例如:“{.3g}.”格式(13.468)
打印13.5
,而不是13.47
)啊,当涉及到指数时,它也会做错误的事情。好吧,我想你可以做“{0:.{1}g}”。格式(13.468,2+len str(int(13.468))
,但这不是真正的Pythonic,我猜这是我独立得出的结论。我希望有一个更好的解决方案,但可能根本没有。谢谢