others - 在python中轻松打印浮点数?

我有一个浮点数列表。如果我简单地 print,它就会显示如下:


[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]



我可以使用 print"%.2f",它需要一个for循环去遍历列表,但是,它不能用于更复杂的数据结构, 我想要像这样的东西(我就是这样做的)


>>> import print_options


>>> print_options.set_float_precision(2)


>>> print [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]


[9.0, 0.05, 0.03, 0.01, 0.06, 0.08]



时间:

这是个旧问题,但是,我会添加一些有用的东西:

我知道你用的是原生的python list编写了例子,但是,如果你决定使用numpy数组(因为你似乎在处理数字数组,这在你的例子中是完全合法的),那么(几乎确切地说)这个命令说的是,你做了这些:


import numpy as np


np.set_printoptions(precision=2)



或者,如果仍然想看到真正精确数字的所有小数,请使用格式化字符串 %g


np.set_printoptions(formatter={"float_kind": lambda x:"%g" % x})



对于只打印一次而不改变全局行为,使用与上面的参数相同的np.array2string

应该注意的是,从Python 2.6开始,推荐的字符串格式化方法是格式化,为Python 3做好准备。


print ["{0:0.2f}".format(i) for i in a]



新的字符串格式化语法并不难使用,但是,却非常强大 ,

我认为这可能是 pprint,但是,我没有找到任何东西相关的

更永久的解决方案是子类化 float


>>> class prettyfloat(float):


 def __repr__(self):


 return"%0.2f" % self



>>> x


[1.290192, 3.0002, 22.119199999999999, 3.4110999999999998]


>>> x = map(prettyfloat, x)


>>> x


[1.29, 3.00, 22.12, 3.41]


>>> y = x[2]


>>> y


22.12



子类化float的问题在于它会破坏显式查找变量类型的代码。但据我所知,这是唯一的问题。一个简单 x = map(float, x) 撤消转换为 prettyfloat

不幸的是,你不能只使用float.__repr__修补程序,因为float不可变,

如果不想分类 float,但是,不要介意定义函数,map(f, x)比, [f(n) for n in x]

你可以:


a = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]


print ["%0.2f" % i for i in a]



请注意,还可以将字符串如"%.2f"相乘(例如: " %.2f"*10).


>>> print"%.2f"*len(yourlist) % tuple(yourlist)


2.00 33.00 4.42 0.31 




print"[%s]"%",".join(map(str,yourlist))



这将避免在打印时出现二进制表示的舍入错误,而不引入固定精度约束(与使用"%.2f"格式化):


[9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303]



最简单的选择应该是使用舍入例程:


import numpy as np


x=[9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]



print('standard:')


print(x)


print("nhuman readable:")


print(np.around(x,decimals=2))



这将产生输出:


standard:


[9.0, 0.053, 0.0325754, 0.0108928, 0.0557025, 0.0793303]



human readable:


[ 9. 0.05 0.03 0.01 0.06 0.08]



我相信python3.1会在默认情况下更好地打印它们,没有任何代码更改, 但是,如果你使用任何尚未更新的扩展来使用Python 3.1,这将毫无用处


print",".join("%.2f" % f for f in list_o_numbers)



尝试一下:


>>> nums = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999]


>>> print",".join("%.2f" % f for f in nums)


9.00, 0.05, 0.03, 0.01




l = [9.0, 0.052999999999999999, 0.032575399999999997, 0.010892799999999999, 0.055702500000000002, 0.079330300000000006]



python 2:


print ', '.join('{:0.2f}'.format(i) for i in l)



python 3:


print(', '.join('{:0.2f}'.format(i) for i in l))



输出:


9.00, 0.05, 0.03, 0.01, 0.06, 0.08



...