Python 修改浮点数显示精度
好的,我想用repr()这个函数来打印出一些列表和嵌套数组的文本版本。
不过,我希望数字只保留四位小数,比如说不是显示42.7635745114,而是显示32.7635。
我想用repr()是因为它能很好地处理嵌套数组。自己写一个打印循环我觉得不太好。
肯定有办法让repr做这个吧?我看到有repr和reprlib这两个模块,但例子真的很少,几乎没有。
2 个回答
0
你可以试试用字符串格式化的方法,像这样写:return "%.4f" %(self.float)
:
>>> class obj:
... def __init__(self, value):
... self.float = value
... def __repr__(self):
... return "%.4f" %(self.float)
...
>>> x = obj(8.1231231253252)
>>> x.float
8.1231231253252
>>> x
8.1231
>>>
6
不,无法重载 repr()
函数。浮点数的格式是直接写死在 C 语言的源代码里的。
float_repr()
函数 调用了一个辅助函数,并使用了 'r'
格式化器,最终调用了一个工具函数,这个函数把格式写死,结果就是 format(float, '.16g')
。
你可以创建一个 float
的子类,但仅仅为了表示值(特别是在更大的结构中)这样做有点过于复杂。这时候 repr
(在 Python 3 中是 reprlib
)就派上用场了;这个库的设计目的是为了打印任意数据结构的有用表示,并且让你可以自定义打印特定类型的数据。
你可以通过创建一个子类来使用 repr
模块,继承 repr.Repr()
,并提供一个 repr_float()
方法来处理浮点数:
try: # Python 3
import reprlib
except ImportError: # Python 2
import repr as reprlib
class FloatRepr(reprlib.Repr):
def repr_float(self, value, level):
return format(value, '.4f')
print(FloatRepr().repr(object_to_represent))
示例:
>>> import random
>>> import reprlib
>>> class FloatRepr(reprlib.Repr):
... def repr_float(self, value, level):
... return format(value, '.4f')
...
>>> print(FloatRepr().repr([random.random() for _ in range(5)]))
[0.5613, 0.9042, 0.3891, 0.7396, 0.0140]
你可能想要在你的子类中设置 max*
属性,以影响每种容器类型打印多少个值。