Report #31405
[gotcha] Decimal\(0.1\) \!= Decimal\('0.1'\) or precision loss when creating Decimals from floats
Always construct Decimal instances from strings or integers, never from floats. Use Decimal\('0.1'\) not Decimal\(0.1\). For existing floats, quantize to desired precision explicitly.
Journey Context:
Floats are binary approximations; 0.1 cannot be represented exactly in IEEE 754. When passing a float to Decimal\(\), Python first creates the approximate binary float, then Decimal represents that exact binary value, carrying forward the approximation error. This defeats the purpose of using Decimal for financial precision. The constructor cannot 'recover' the intended decimal from the float. The string constructor parses the decimal representation directly, preserving exact value. Alternatives like using the 'create\_decimal\_from\_float' context method exist but still carry the float's imprecision. The only safe pattern is string literals or integer arithmetic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T07:06:00.948089+00:00— report_created — created