Musterknabe
Musterknabe

Reputation: 6081

Rounding error when casting from float to int

We have an API that returns prices as string in EUR, e.g. 2.55 or 0.035. Our database however saves this in cents, so I wrote a really simple method to transform this into cents by just doing

$cents = (int) ((float) $value['value']['amount'] * 100)

So for this code

echo (int) ((float) '2.55' * 100);

the result should be 255, right? But somehow, it's 254. You can test this on your CLI by simply doing

php -r "echo (int) ((float) '2.55' * 100);"

When I get the result of (float) '2.55' * 100) it's simply 255, and when I cast this to int it's 255, why isn't it the same if I cast it to int in the same call?

I mean, I could simply do '2.55' * 100 and the php casting would calculate this correctly, but I'm still curious why this happens?

Version:

PHP 7.1.15-1+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Mar 6 2018 11:10:13) ( NTS )

Upvotes: 1

Views: 1610

Answers (1)

Eddie
Eddie

Reputation: 26844

It could be a floating point error.

In php, a float value like 255 could actually be something like 254.9999991. You can round the value before converting to int.

echo (int) ( round( (float) '2.55' * 100 ) );

This will result to

255

From PHP Doc:

Warning Floating point precision Floating point numbers have limited precision. Although it depends on the system, PHP typically uses the IEEE 754 double precision format, which will give a maximum relative error due to rounding in the order of 1.11e-16. Non elementary arithmetic operations may give larger errors, and, of course, error propagation must be considered when several operations are compounded.

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

Upvotes: 2

Related Questions