2013-02-21 51 views
16

我想格式化浮点数的列表,最多只能输入2位小数。但是,我不想跟踪零,也不想跟踪小数点。大多数Pythonic打印方式*最多*小数位数

因此,举例来说,4.001 =>44.797 =>4.88.992 =>8.9913.577 =>13.58

简单的解决方案是('%.2f' % f).rstrip('.0')('%.2f' % f).rstrip('0').rstrip('.')。但是,这看起来相当丑陋,而且看起来很脆弱。任何更好的解决方案,也许有一些神奇的格式标志?

+0

我错过了点这里,或者怎么样'轮()'函数:HTTP://文档。 python.org/2/2/library/functions.html#round – TerryA 2013-02-21 08:43:00

+0

虽然,我不得不说,我不是一个涉及'round'的解决方案的狂热粉丝,因为我很紧张,我会把'1.1000000000009962'作为一个输出有一天。 – nneonneo 2013-02-21 08:43:57

+4

Aarrgh,它不是重复的!我不想跟随'.0'。另一个问题允许。 – nneonneo 2013-02-21 08:47:00

回答

15

您需要分离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' 
+0

+1:我想这是我独立完成的结论。我希望有一个更好的解决方案,但可能没有一个。谢谢! – nneonneo 2013-02-21 11:44:42

13

g格式化输出限制为n显著位,下探尾随零:

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

如果您只有一个模板,则可以使用['format()'function](http://docs.python.org/2/library/functions.html#format)。例如'格式(f,'.3g')'。这甚至适用于0。 – 2013-02-21 11:32:39

+3

几乎...除了打印*最多三位数字*,而不是*最多两位小数*。 (例如:''{:.3g}'.format(13.468)'打印'13.5'而不是'13.47') – nneonneo 2013-02-21 11:34:41

+1

啊,当涉及到指数时,它也会做错误的事情。 – 2013-02-21 11:36:47

5

一般来说,使用String [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') 

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

相关问题