views:

29

answers:

2

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
+2  A: 

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 allows 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.

Artefacto
+1  A: 

You should have a look at this page: http://php.net/manual/en/language.types.float.php. It describes the pitfalls working with floating point numbers.

Dennis Haarbrink
Another good reference that shows this is a common issue for most computer languages is http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
Mark Baker