1

当我使用 DecimalField 时,我在数据库中的位置很少。不幸的是,我必须同时处理双精度和浮点数据作为输入 - 这是我的问题。

我想做残酷的切断价值(小数点后第二位),而不是数学回合。我存储了几乎不会超过目标的计算值(如果我的值是 49.9832100000032131,它仍然小于 50,所以我不会四舍五入)。但正如我所说 - 我想将其保存为 48.98 在数据库中(小数点后 2 位) - 节省内存和足够的表示。

我的第一个解决方案是使用自定义 django 字段,如下所示:

class DecimalFixedField(models.DecimalField):

def __init__(self, *args, **kwargs):
    kwargs['value'] = "{0:.2f}".format( kwargs['value'] )            
    # or ? self.value = "{0:.2f}".format( kwargs['value'] )
    super(DecimalFixedField, self).__init__(*args, **kwargs)

当然我应该在 kwargs 中硬编码 decimal_places = 2 或者在代码中使用它而不是值 2,但是......休息呢?你有提示,更好的主意吗?

重要的是——我不想在代码的很多地方写“{0:.2f}”.format(...) !我想在 OOP 方法中做到这一点,因为我在许多模型中使用 DecimalField ......并且使这种预处理看起来是不错的解决方案。任何想法应该如何正确实施?

4

2 回答 2

0

经过思考和尝试,我做了这样的事情:

class DecimalFixedField(models.DecimalField):

    def pre_save(self, model_instance, add):

        # reading value
        value_field = getattr(model_instance, self.attname)

        # casting to decimal if the value is not a decimal (float for example)
        if not isinstance(value_field, decimal.Decimal):
            value_field = decimal.Decimal(str(value_field))

        # there you can cut off the value
        quantized_value = value_field.quantize(decimal.Decimal(str(0.1**self.decimal_places)), rounding=decimal.ROUND_DOWN)

        # saving value
        setattr(model_instance, self.attname, quantized_value)
        return quantized_value

也许它会对某人有所帮助:)

于 2016-04-26T12:46:30.897 回答
0

尝试使用这个:

from decimal import Decimal

my_value = Decimal(value) 
于 2016-04-19T16:13:43.043 回答