【发布时间】:2010-11-03 23:43:10
【问题描述】:
[Python 3.1]
我正在跟进this answer:
class prettyfloat(float):
def __repr__(self):
return "%0.2f" % self
我知道我需要跟踪我的浮点字面量(即将3.0 替换为prettyfloat(3.0) 等),这很好。
但每当我进行任何计算时,prettyfloat 对象都会转换为 float。
最简单的修复方法是什么?
编辑:
我需要两个十进制数字;我在整个代码中都需要它,包括在其中打印带有float 值的字典。这使得任何格式化函数都难以使用。
我不能使用 Decimal 全局设置,因为我希望计算是完全精确的(只打印 2 个小数点)。
@Glenn Maynard:我同意我不应该覆盖__repr__;如果有的话,那就是__str__。但由于以下几点,这是一个没有实际意义的问题。
@Glenn Maynard 和@singularity:我不会继承float,因为我同意它最终会看起来很丑。
我将不再试图变得聪明,而是在打印float 的任何地方调用一个函数。虽然我真的很难过我不能在内置类float 中覆盖__str__。
谢谢!
【问题讨论】:
-
最简单的格式化格式可能是使用
decimal.Decimal。这有什么问题? -
我还没有看到这样的案例,其中子类化像
float这样的核心类型是正确的做法。 -
@S.Lott 我需要两个十进制数字;我在整个代码中都需要它,包括在其中打印带有浮点值的字典的位置。 @Glenn Maynard 我也不抱太大希望:(只是想也许有一种干净的方法可以让它发挥作用。
-
让一个类的
repr循环值是错误的行为,并且可能会以奇怪和微妙的方式破坏事情,因为 Python 代码应该能够依赖于eval(repr(1.12345))是一个循环-行程操作。repr是处理格式的错误位置。 -
请更新您的问题以包含所有事实。请不要将 cmets 添加到您拥有的问题中。请更新问题。
标签: python floating-point python-3.x subclass built-in-types