Обновление: В вашем текущем решении нет ничего плохого.
Нет float
до str
до decimal.Decimal
туда-обратно.
Как объясняют документы (мой акцент):
parse_float , если он указан, будет вызываться со строкой каждого JSONплавающий для расшифровки.По умолчанию это эквивалентно float (num_str).Это можно использовать для использования другого типа данных или анализатора для чисел с плавающей запятой JSON (например, decimal.Decimal
).
Первоначальный ответ ниже
Передача значения float
в decimal.Decimal
не гарантирует требуемой точности.Это связано с тем, что по своей природе float
хранится не в виде десятичного числа, а в двоичном виде.
Это может быть облегчено, если вы можете передавать строковые входные данные в decimal.Decimal
:
from decimal import Decimal
res1 = Decimal(3.8)*Decimal(10)
res2 = Decimal('3.8')*Decimal('10')
print(res1) # 37.99999999999999822364316060
print(res2) # 38.0
Таким образом, одним из решений было бы обеспечить сохранение / чтение числовых данных JSON в виде строк вместо плавающих.
Будьте осторожны, реализация, как показано ниже, может работать , но зависит от str
выполнение определенной работы, то есть правильное округление float
для десятичного представления.
def lambda_handler(event):
value = event['value']
print(Decimal(str(value)))
lambda_handler({"value": 3.8}) # 3.8