I'trying to convert a float to an int value in php:
var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920
I can use ceil to make it work but can somebody explain this to me?
var_dump((int)ceil(39.3 * 100.0)); //Returns 3930
This is because numbers that have a finite representation in base 10 may or may not have an exact representation in the floating point representation PHP uses.
See
>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));" string(45) "3929.9999999999995452526491135358810424804688"
Since int
always rounds the number down, a small error in the representation makes the cast round it one number down that you would otherwise expect.
Consider using round
instead.
This might be late but the proper way to do it is as follows:
(int) bcmul("39.3", "100.0"); // 3930
(int) bcmul("39.2", "100.0"); // 3920
and for dealing with digits / calculation for floats, or anything that involves money transaction, you should never use directly multiplication/division + casting.
please refer to this as well:
http://php.net/manual/en/book.bc.php
notice: the casting in my answer is just to convert String to Int, (you don't need to do it)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With