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.
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.