Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP unexpected result of float to int type cast

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
like image 309
dan Avatar asked Aug 02 '10 07:08

dan


2 Answers

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.

like image 142
Artefacto Avatar answered Oct 02 '22 20:10

Artefacto


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)

like image 23
Shehabic Avatar answered Oct 02 '22 19:10

Shehabic