Python 修改浮点数显示精度

2 投票
2 回答
4401 浏览
提问于 2025-04-18 09:33

好的,我想用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* 属性,以影响每种容器类型打印多少个值。

撰写回答