Recientemente encontramos un bug en el que la confirmación de pago que nos llegó de nuestro proveedor difería por un céntimo de lo esperado. Esto nos resultó extraño ya que a través de todo nuestro proyecto trabajamos con el tipo Decimal siempre que trabajamos con precios.

Pero se nos escapó en un sitio: la función json.loads, que por defecto convierte los números en floats. Para solucionarlo tan solo hay que pasarle el parámetro opcional parse_float=Decimal:

>>> import json
>>> data = '{"amount": 160.39}'
>>> json.loads(data)["amount"] * 100
16038.999999999998
>>> json.loads(data, parse_float=Decimal)["amount"] * 100
Decimal('16039.00')