I have a small financial application with PHP as the front end and MySQL as the back end. I have ancient prejudices, and I store money values in MySQL as an integer of cents
Casting does not round()
as in round-to-nearest, it truncates at the decimal: (int)3.99
yields 3
. (int)-3.99
yields -3
.
Since float arithmetic often induces error (and possibly not in the direction you want), use round()
if you want reliable rounding.
When converting from float to integer, the number will be rounded towards zero (src).
Read the Floating point precision warning.
The code you posted does the multiplication first, forcing a floating point calculation that introduces error, before converting the value to an integer. Instead, you should avoid floating point arithmetic entirely by reversing the order. Convert to integer values first, then perform the arithmetic.
Assuming previous code already validated and formatted the input, try this:
list($bills, $pennies) = explode('.', $dollars);
$cents = 100 * $bills + $pennies;
Your prejudice against floating point values to represent money is well founded because of truncation and because of values being converted from base-10 to base-2 and back again.