Rounding Errors
What it detects
This detector identifies potential loss of precision due to Solidity's use of integer arithmetic, particularly in division and modulo operations. Because Solidity does not support floating-point numbers, any division involving integers will truncate the result toward zero, silently discarding any remainder.
Rounding errors can lead to subtle and compounding issues in contracts that involve:
- Percentage-based calculations
- Pro-rata distribution of funds
- Interest, reward, or staking logic
- Token swaps and automated market makers (AMMs)
These errors often go unnoticed during testing but can significantly affect fairness, financial accuracy, or protocol stability over time.
Typical symptoms
- Calculations yield smaller (rounded-down) results than expected
- Division returns zero when small values are divided by larger ones
- Percentage math results in zero for low inputs (e.g.,
amount * 5 / 100
) - Accumulated rounding leads to leftover tokens, fees, or misallocated funds
- Users receive slightly less than their fair share in distributions
Solidity snippet (v0.8.25)
pragma solidity ^0.8.25;
contract RoundingDemo {
function divide(uint256 a, uint256 b) external pure returns (uint256) {
// Precision loss if 'a' is not an exact multiple of 'b'
return a / b;
}
function percent(uint256 amount) external pure returns (uint256) {
// Example: returns 0 if amount < 20
return amount * 5 / 100;
}
}
Mitigation Strategies
- Perform multiplication before division (e.g.,
amount * 100 / total
) - Use fixed-point math libraries (e.g., OpenZeppelin’s
SafeMath
orABDKMath64x64
) - Round up using
(a + b - 1) / b
where appropriate - Track remainders or leftover values and redistribute them later
Why it matters on EVM
On the EVM, rounding is not just a precision issue, it directly affects value distribution, token economics, and fairness. Since the smallest unit (wei or token decimal) is meaningful in DeFi, losing even a few units repeatedly across thousands of transactions can cause:
- Protocol fund imbalances
- Inconsistent user experiences
- Unfair outcomes in financial logic
- Exploits involving leftover tokens or fees (e.g., dust sniping)
- Mispriced swaps and errors in AMM pools
Rounding errors are a fundamental risk in financial smart contracts. Proactively detecting and compensating for them ensures robust, fair, and predictable protocol behavior.