PHP ceil 函数行为怪异


PHP ceil function strange behavior ?

有人可以解释一下吗?

echo ceil( 20.7 * 100 ); // returns 2070
echo ceil( 2070 );       // returns 2070

一切都很好,合乎逻辑,但是

echo ceil( 40.7 * 100 ); // returns 4071
echo ceil( 4070 );       // returns 4070

行,不合逻辑...

为什么会有这种差异?

谢谢

点数的奇妙世界:

printf("%.18f'n", 40.7*100);
//prints 4070.000000000000454747
printf("%.18f'n", 20.7*100);
//prints 2070.000000000000000000

简而言之:浮点数不能准确地表示所有有理数。特别是,407/10 和 207/10 都不能精确表示,因此整数转换的结果总是有一个单位的不确定性。

唯一可以完全表示为二进制浮点数的有理数是"小奇整数乘以 2 的幂"的形式,或者换句话说,那些具有小二进制展开的有理数。

浮点错误。 40.7 不能在浮点数中精确表示。它会像 40.700000001 或其他什么。当您* 100并 ceil 它时,它会四舍五入到 4071。

使用任意精度库 bcmath,例如:

ceil(bcmul(40.7, 100)); // 4070

点数问题...你可以用这样的东西来克服你的问题:

echo ceil( (int) (40.7 * 100) );

你可以用这样的东西来克服你的问题:

$result = 40.7 * 100;
$result = (string) $result;
echo ceil($result);