简体   繁体   中英

Rounding error when casting from float to int

We have an API that returns prices as string in EUR, eg 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 )

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM