PHP unexpected result of float to int type cast

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)


// gives: int(3930)
var_dump(intval((39.3 * 100.0) . '')); 

or, for use with a function:

function floatToInteger ($fValue)
{
    return (intval(($fValue + 0) . ''));
}

// gives: int(3930)
var_dump(floatToInteger(39.3 * 100.0));