How to Implement float_is_zero and float_compare in Odoo?
Why Use Them?
In Odoo, financial and quantity calculations often involve floating-point numbers, which can suffer from precision issues (e.g., 0.00000001 ≠ 0). To ensure accurate comparisons, Odoo provides utility functions:
- float_is_zero(): Check if a float is effectively zero.
- float_compare(): Compare two float values considering precision.
These are defined in Odoo’s utility module: from odoo.tools.float_utils import float_is_zero, float_compare
✅ 1. float_is_zero()
Purpose:
Safely determine whether a float value is equal to zero, considering the precision of the unit of measure (UoM) or currency.
Syntax:
float_is_zero(value, precision_digits)
- value: The float to compare
- precision_digits: The number of decimal digits to consider (e.g., 2 for currency, 6 for quantities)
📌 Realistic Example:
Check if a product quantity is effectively zero:
from odoo.tools.float_utils import float_is_zero
if float_is_zero(line.product_uom_qty, precision_digits=6):
raise UserError("Quantity cannot be zero.")
Useful in stock movements or manufacturing where precision matters.
✅ 2. float_compare()
Purpose:
Compare two float values with a defined precision.
Syntax:
float_compare(value1, value2, precision_digits)
- Returns 0 if equal, -1 if value1 < value2, 1 if value1 > value2
📌 Realistic Example:
from odoo.tools.float_utils import float_compare
if float_compare(order.amount_total, 1000.0, precision_digits=2) > 0:
order.message_post(body="High-value order (above 1000).")
Can be used to:
- Validate minimum order amounts
- Trigger logic on price or quantity thresholds
✅ Summary Table
Function | Purpose | Returns | Use Case |
float_is_zero() | Check if float ≈ 0 | True / False | Zero-check in quantities, balances |
float_compare() | Compare two floats safely | 0, -1, or 1 | Price thresholds, conditional logic |