更改默认浮点数打印格式

20 投票
9 回答
32974 浏览
提问于 2025-04-16 01:23

我有一些列表和更复杂的结构,里面包含浮点数。当我打印这些浮点数时,看到它们有很多小数位,但其实我并不需要这么多小数位。

所以我想定义一个自定义的格式,比如只保留2位或3位小数,在打印浮点数的时候使用。

我需要使用浮点数,而不是Decimal类型。而且,我不能对浮点数进行截断或四舍五入。

有没有办法改变默认的打印方式呢?

9 个回答

6
>>> a = 0.1
>>> a
0.10000000000000001
>>> print a
0.1
>>> print "%0.3f" % a
0.100
>>>

根据Python文档,使用repr(a)可以得到17位数字(你在交互式提示符下直接输入a时就能看到),而str(a)(在你打印时自动执行)则会四舍五入到12位。

编辑:最基本的解决方法...不过你需要使用自己的类,所以...嗯。

>>> class myfloat(float):
...     def __str__(self):
...             return "%0.3f" % self.real
>>> b = myfloat(0.1)
>>> print repr(b)
0.10000000000000001
>>> print b
0.100
>>>
8

这段话并没有回答关于浮点数嵌套在其他结构中的更一般性的问题,但如果你只是想在列表或者类似数组的嵌套列表中打印浮点数,可以考虑使用 numpy 这个库。

比如,

import numpy as np
np.set_printoptions(precision=3, suppress=False)
list_ = [[1.5398, 2.456, 3.0], 
         [-8.397, 2.69, -2.0]]
print(np.array(list_))

会得到

[[ 1.54   2.456  3.   ]
 [-8.397  2.69  -2.   ]]
10

正如Ignacio所说,你不能随便修改C语言的类型。

不过,如果你真的很想这么做,并且对C语言有一些了解,你可以自己去修改Python解释器的源代码,然后重新编译成一个自定义的版本。我曾经修改过列表的一些标准行为,这个过程虽然有点麻烦,但还算可以。

我建议你找一个更好的解决办法,比如用"%0.2f"这种格式来打印浮点数:

for item in mylist:
    print '%0.2f' % item,

或者

print " ".join('%0.2f' % item for item in mylist)

撰写回答