php - 为什么floor舍入整数?

时间:2009-12-07 23:27:21

标签: php

我很困惑为什么:

echo log10(238328) / log10(62);

结果为3

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

结果为2

我知道地板向下舍入,但我认为它只适用于十进制数字。

如何在通常四舍五入的情况下得到后一种判断中的3种答案?

6 个答案:

答案 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 - > ceil(0.2)==1 && ceil(0.8)==1
  • floor - > floor(0.2)==0 && floor(0.8)==0
  • round - > round(0.2)==0 && round(0.8)==1