在python中子类化float强制定点打印精度

2024-09-28 13:28:08 发布

您现在位置:Python中文网/ 问答频道 /正文

[Python 3.1]

我正在跟进this answer

class prettyfloat(float):
  def __repr__(self):
    return "%0.2f" % self

我知道我需要跟踪我的浮点字面值(例如,将3.0替换为prettyfloat(3.0),等等),这很好。在

但是每当我做任何计算时,prettyfloat对象被转换成{}。在

最简单的方法是什么?在

编辑:

我只需要两个十进制数字;我需要它贯穿整个代码,包括在哪里打印一个包含float值的字典。这使得任何格式化函数都很难使用。在

我不能使用Decimal全局设置,因为我希望计算是完全精确的(只打印两个小数点)。在

@Glenn Maynard:我同意我不应该重写__repr__;如果有什么,那就是__str__。但这是一个没有实际意义的观点,因为下面这一点。在

@Glenn Maynard和@singularity:I'll not subclass float,因为我同意它最终看起来会很难看。在

我不想再耍聪明了,只要在打印float的地方调用一个函数。虽然我很遗憾我不能重写内置类中的__str__,但是我很遗憾。在

谢谢你!在


Tags: 函数answerselfreturndeffloatthisclass
3条回答

我看了你的回答,我认为你混淆了数据及其表示。在

@Robert Rossney建议将float子类化,这样你就可以map()一个标准的、非掺假的floats组成prettyfloats以供显示之用:

^{1}$

你不应该在任何地方用cd4{1}代替你的代码。在

当然,从float继承来解决这个问题是一种过度杀戮,因为这是一个表示问题,而不是数据问题。一个简单的函数就足够了:

^{pr2}$

现在,如果这与表示无关,而您实际想要实现的是代码中每个地方的定点计算都限制在两个小数位,那就是another story。在

使用decimal。这就是它的目的。在

^{1}$

…除非您真的想在代码中的任何地方都使用全精度浮点值,但将它们四舍五入到小数点后两位。在这种情况下,您需要重写打印逻辑。在

因为prettyfloat (op) prettyfloat不返回prettyfloat

示例:

^{1}$

如果您不想将每个操作结果手动强制转换为prettyfloat,并且仍然希望使用prettyfloat的话,解决方案是重写所有运算符。在

带有运算符__add__(这很难看)的示例

^{pr2}$

通过这样做,我认为您还必须将名称从prettyfloat更改为uglyfloat:),希望这将有所帮助

相关问题 更多 >

    热门问题