5

有人可以解释一下吗?

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

5 回答 5

7

浮点数的奇妙世界:

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

//prints 4070.000000000000454747

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

//prints 2070.000000000000000000

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

唯一可以精确表示为二进制浮点数的有理数是“小奇数乘以二的幂”的形式,或者换句话说,具有小二进制展开的有理数。

于 2011-11-25T14:36:41.903 回答
3

浮点错误。40.7 不能用浮点数精确表示。这将是 40.700000001 之类的东西。当你* 100加 ceil 时,它会四舍五入到 4071。

于 2011-11-25T14:35:25.177 回答
1

使用任意精度库bcmath例如:

ceil(bcmul(40.7, 100)); // 4070
于 2020-11-18T13:45:45.880 回答
0

浮点数问题...您可以通过以下方式解决问题:

echo ceil( (int) (40.7 * 100) );
于 2011-11-25T14:42:44.453 回答
0

您可以通过以下方式解决您的问题:

$result = 40.7 * 100;
$result = (string) $result;
echo ceil($result);
于 2022-01-13T08:14:53.487 回答