PHP ceil函数奇怪的行为?

时间:2011-11-25 14:32:07

标签: php ceil

有人可以解释一下吗?

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

一切都好,合乎逻辑,但

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

不行且不合逻辑......

为什么会有这种差异?

由于

4 个答案:

答案 0 :(得分:6)

浮点数的精彩世界:

printf("%.18f\n", 40.7*100);

//prints 4070.000000000000454747

printf("%.18f\n", 20.7*100);

//prints 2070.000000000000000000

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

唯一可以精确表示为二进制浮点数的有理数的形式是“小的奇数整数乘以2的幂”,换句话说,就是具有小二进制扩展的那些。

答案 1 :(得分:3)

浮点错误。 40.7无法在浮点数中精确表示。它会像40.700000001或其他什么。当你* 100并将其提升时,它会累计到4071。

答案 2 :(得分:0)

浮点数问题......您可以通过以下方式克服您的问题:

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

答案 3 :(得分:0)

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

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