最具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,我猜这是我独立得出的结论。我希望有一个更好的解决方案,但可能根本没有。谢谢