浮点数的简单美观打印?
我有一个浮点数的列表。如果我直接用 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]
19 个回答
84
一个更持久的解决方案是创建一个 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]
简洁很多。
31
这是个老问题,但我想补充一些可能有用的内容:
我知道你用的是普通的Python列表,但如果你决定用numpy
数组(这在你的例子中是完全可以的,因为你似乎在处理数字数组),那么你可以用一个几乎和你自己想出来的命令一样的指令:
import numpy as np
np.set_printoptions(precision=2)
如果你想看到非常精确数字的所有小数位,但又想去掉多余的零,可以使用格式化字符串%g
,这样效果会更好:
np.set_printoptions(formatter={"float_kind": lambda x: "%g" % x})
如果只是想打印一次,不想改变全局设置,可以用np.array2string
,参数和上面的一样。