Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP integer rounding problems

echo (int) ( (0.1+0.7) * 10 );

Why does the above output 7? I understand how PHP rounds towards 0, but isn't (0.1+0.7) * 10 evaluated as a float and then casted as an integer?

Thanks!

like image 279
joshim5 Avatar asked Nov 21 '10 02:11

joshim5


2 Answers

There's a loss in precision when decimals are converted internally to their binary equivalent. The computed value will be something like 7.9+ instead of the expected 8.

If you need a high degree of accuracy, use the GMP family of functions or the bcmath library.

like image 162
bcosca Avatar answered Sep 23 '22 06:09

bcosca


See the manual:

http://php.net/manual/en/language.types.float.php

It is typical that simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9.

like image 40
Matthew Avatar answered Sep 20 '22 06:09

Matthew