PHP在这里做什么?一个错误吧?

时间:2015-08-26 12:26:15

标签: php math ceil

为什么地球上$ r2的值是2027?

$r1 = ceil( 10.26 * 100);  //equals 1026 - CORRECT.

$r2 = ceil( 20.26 * 100);   //equals 2027 - WRONG!

(我猜是因为某些原因(20.26 * 100)不会产生完全整数,但是为什么??!?这不是一个错误吗?

2 个答案:

答案 0 :(得分:1)

浮点数以意想不到的方式表现。 (谷歌文章"每个计算机科学家应该知道关于浮点"详情)

基本上,计算机无法精确处理浮点值,因此您总是需要在计算中预期一些近似值(这就是为什么您永远不应该将钱表示为浮点数)。

在您的情况下,结果为:

20.26 * 100

2026.0000000000002

ceil向上舍入到最接近的整数,即2027,所以答案是正确的。

答案 1 :(得分:0)

不,这不是一个错误。这与浮点数的精度有关。您可能知道,计算机是一台离散的机器。实数在两个实数之间有无数的数字:计算机不可能将数字处理为无穷大,甚至不能处理0.00到0.01之间的所有数字:例如:中间存在无限数量的实数。

您的计算机离散地处理实数:所有数字都四舍五入到最接近的可表示浮点数;因此,浮点数总是包含一个表示错误(除非您正在寻找的真实数字可以准确表示)。计算中的所有小错误都是最终错误的原因。这就是你的情况。有关更多信息和数学解释:https://en.wikipedia.org/wiki/Floating_point

现实生活中的一个例子。只需运行这段PHP代码,看看会发生什么:

$sum = 0.0;
for ($i = 0; $i < 1000; $i++) {
    $sum += 0.1;
}

你会期望总和会变成100,对吧?

关于你的代码的另一个提示:如果你只是使用ceil()来获取整数,那么你最好使用round()函数。