我很困惑为什么:
echo log10(238328) / log10(62);
结果为3
但
echo floor(log10(238328) / log10(62));
结果为2
我知道地板向下舍入,但我认为它只适用于十进制数字。
如何在通常四舍五入的情况下得到后一种判断中的3种答案?
答案 0 :(得分:10)
PHP使用双精度浮点数。两个对数的结果都不能精确表示,因此除以它们的结果并不精确。您获得的结果接近但略小于3.当由echo
格式化时,这会舍入为3。 floor
,但会返回2.
通过利用log(x, b) / log(y, b)
等同于log(x, y)
(对于任何基础b
)这一事实,您可以避免不精确的划分。这将为您提供表达式log(238328, 62)
,其浮点结果正好为3(自238328为pow(62, 3)
以来的正确结果)。
答案 1 :(得分:9)
这是由于在PHP中抛出浮点数的方式。
有关详细信息,请参阅the PHP Manual's Floating Point Numbers entry
解决方法是floor(round($value, 15));
。这样做可以确保您的号码非常准确。
答案 2 :(得分:6)
如果你var_dump你会看到“3”实际上是一个浮点数。这意味着它可能接近3并且四舍五入。如果你想要3,你将不得不使用姐妹函数ceil。
答案 3 :(得分:2)
使用round()函数和/或显式地将其转换为int而不是依赖于ceil(),可能会获得更好的结果。点击此处了解更多信息:http://php.net/manual/en/language.types.integer.php
答案 4 :(得分:1)
以一点点性能为代价,您可以强制它,通过舍入或字符串格式化数字将精度降低到更有用的范围:
echo floor(round(log10(238328)/log10(62), 4));
echo floor(sprintf('%.4f', log10(238328)/log10(62)));
// output:
// 3
// 3
您应该使用所需的最低精度。更精确的是不你想要的。没有地板的圆形可能更正确,结果因精度而异。
echo floor(round(log10(238328)/log10(62), 16));
echo round(log10(238328)/log10(62), 16);
// output:
// 2
// 3
答案 5 :(得分:1)
有三个功能几乎相同:
ceil(0.2)==1 && ceil(0.8)==1
floor(0.2)==0 && floor(0.8)==0
round(0.2)==0 && round(0.8)==1