Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php - why does floor round down a integer?

Tags:

php

I am confused as to why:

echo log10(238328) / log10(62);

results in 3

but

echo floor(log10(238328) / log10(62));

results in 2

I know floor rounds down but I thought it was only for decimal numbers.

How can I get an answer of 3 out of the latter statment whilst still normally rounding down?

like image 882
ma long Avatar asked Aug 08 '26 11:08

ma long


2 Answers

PHP uses double-precision floating point numbers. Neither of the results of the two logarithms can be represented exactly, so the result of dividing them is not exact. The result you get is close to, but slightly less than 3. This gets rounded to 3 when being formatted by echo. floor, however returns 2.

You can avoid the inexact division by taking advantage of the fact that log(x, b) / log(y, b) is equivalent to log(x, y) (for any base b). This gives you the the expression log(238328, 62) instead, which has a floating point result of exactly 3 (the correct result since 238328 is pow(62, 3)).

like image 200
Phil Ross Avatar answered Aug 11 '26 00:08

Phil Ross


It's due to the way floating point numbers are polished in PHP.

See the PHP Manual's Floating Point Numbers entry for more info

A workaround is to floor(round($value, 15));. Doing this will ensure that your number is polished quite accurately.

like image 22
Kenaniah Avatar answered Aug 11 '26 00:08

Kenaniah



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!