Python 设置小数字段的上下文精度

问题描述 投票:0回答:1
from decimal import Decimal, setcontext, getcontext

class MyNewSerializer(serializers.Serializer):
    total_value_base = serializers.SerializerMethodField()
    total_outgoing_value_base = serializers.DecimalField(
        max_digits=38,
        decimal_places=8,
        source="value_sent",
    )
    total_incoming_value = serializers.DecimalField(
        max_digits=38,
        decimal_places=4,
        source="value_received",
    )

    def get_total_value_base(self, obj):
        total = Decimal(obj.value_received) + Decimal(
            obj.value_sent
        )
        # Values of above objects
        # obj.value_received = 425933085766969760747388.45622168 
        # obj.value_sent = 0
        # total = 425933085766969760747388.4562  

        dec = Decimal(str(total))
        return round(dec, 8)

但这会引发错误:

return round(dec, 8)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

当我执行以下操作时,此问题已修复:

def get_total_value_base(self, obj):
        # the below line fixes the issue
        getcontext().prec = 100
        
        total = Decimal(obj.value_received) + Decimal(
            obj.value_sent
        )
        # Values of above objects
        # obj.value_received = 425933085766969760747388.45622168 
        # obj.value_sent = 0
        # total = 425933085766969760747388.4562  

        dec = Decimal(str(total))
        return round(dec, 8)

我想提高该类以及其他类似类中所有值的精度。

我如何使用基类或覆盖整个文件或文件中的各个类的 Decimal 类来做到这一点?

我希望提高文件中各种不同类中存在的 100 个变量的小数精度。

python python-3.x django decimal
1个回答
0
投票

可以通过以下方式完成:

from decimal import Decimal, getcontext

class HighDecimalPrecision:
    def __getattribute__(self, name):
        # Set the precision for Decimal operations
        getcontext().prec = 50
        return super().__getattribute__(name)

class MyNewSerializer(HighDecimalPrecision, serializers.Serializer):
    ...
© www.soinside.com 2019 - 2024. All rights reserved.