一尘不染

PHP浮到int类型强制转换的意外结果

php

我试图将浮点数转换为php中的int值:

var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920

我可以使用ceil使其工作,但是有人可以向我解释吗?

var_dump((int)ceil(39.3 * 100.0)); //Returns 3930

阅读 261

收藏
2020-05-29

共1个答案

一尘不染

这是因为以10为底的有限表示形式的数字在PHP使用的浮点表示形式中可能具有也可能没有确切的表示形式。

看到

> php -r“回显var_dump(sprintf('%。40F',39.3 * 100.0));”
字符串(45)“ 3929.9999999999995452526491135358810424804688”

由于int总是将数字四舍五入,因此制图表达中的一个小错误使它可以将其四舍五入为一个原本希望的数字。

考虑round改为使用。

2020-05-29