Search code examples
phprounding-error

PHP - Converting a String float to an Integer - Wrong value


Why does this code provide 853 instead of 854?

(int) ((float) ( "8.54") * 100);

How do I convert (string) "8.54" into (integer) 854?


Solution

  • First of all, read Is floating point math broken?

    8.54 happens to be one of those numbers which can be written precisely in decimal, but not in binary, so (float)"8.54" will actually create a number very very close to, but slightly under, 8.54.

    Multiplying that by 100 will create a number very very close to, but slightly under, 854. And casting to int will find the next smallest integer (e.g. 853.9 becomes 853, not 854).

    I can think of two solutions:

    • After multiplying by 100, round to the nearest whole number, then convert to integer. Unlike 8.54, 854 itself can be represented precisely in floating point, so round(8.54 * 100) will give a number that is exactly 854, rather than slightly under it. So (int)round((float)"8.54" * 100) will give 854 as an integer.
    • Instead of multiplying by 100, remove the . from the string, and convert to int directly, e.g. (int)str_replace(".", "", "8.54"));