gpt4 book ai didi

python - 尾随零在我的 DecimalField 上不一致地出现

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:42 25 4
gpt4 key购买 nike

我想使用具有 6 位小数的 DecimalField 并在独立模型中对其进行测试:

class MyItem(models.Model):
myval = models.DecimalField(max_digits=18, decimal_places=6)
def __str__(self):
return str(self.myval)

现在我正在使用内置管理器,并观察以下内容:

  • 按预期添加最多 4 位小数的值 (0.0001)
  • 添加大于 1 的值似乎没问题

但是,添加诸如 0.000010.000001 之类的值将显示尾随零,即 0.000010

虽然它在数学上是正确的(相同的数字),并且我可以毫不费力地修剪零,但我很烦恼,有时这个零出现,有时却没有。我也没有测试过很大范围的数字,并且不确定是否真的会为所有数字保存正确的值。

据我了解,DecimalField 应该保持准确性。我在创建模型时缺少一些基本的东西吗?这是怎么回事?

使用的版本是Python 3.3和Django 1.6

最佳答案

这是对 DecimalField 模型的覆盖,应该可以解决该问题,发现 here :

class NonscientificDecimalField(DecimalField):
""" Prevents values from being displayed with E notation, with trailing 0's
after the decimal place truncated. (This causes precision to be lost in
many cases, but is more user friendly and consistent for non-scientist
users)
"""
def value_from_object(self, obj):
def remove_exponent(val):
"""Remove exponent and trailing zeros.
>>> remove_exponent(Decimal('5E+3'))
Decimal('5000')
"""
context = decimal.Context(prec=self.max_digits)
return val.quantize(decimal.Decimal(1), context=context) if val == val.to_integral() else val.normalize(context)

val = super(NonscientificDecimalField, self).value_from_object(obj)
if isinstance(val, decimal.Decimal):
return remove_exponent(val)

关于python - 尾随零在我的 DecimalField 上不一致地出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com