Python Установка точности контекста для десятичного поля
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 переменных, которые присутствуют в файле в различных классах.
Это можно сделать следующим образом:
from decimal import Decimal, getcontext
class HighDecimalPrecision:
def __getattribute__(self, name):
# Set the precision for Decimal operations
getcontext().prec = 100
return super().__getattribute__(name)
class MyNewSerializer(HighDecimalPrecision, serializers.Serializer):
...