PHP 将 float 转换为 int 类型的意外结果

标签 php casting floating-point type-conversion

我试图在 php 中将 float 值转换为 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

最佳答案

这是因为以 10 为基数具有有限表示的数字在 PHP 使用的浮点表示中可能具有也可能不具有精确表示。

>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"
string(45) "3929.9999999999995452526491135358810424804688"

由于 int 总是将数字向下舍入,表示中的一个小错误会使强制转换将其向下舍入一个数字,而您原本期望的是这样。

考虑使用 round相反。

关于PHP 将 float 转换为 int 类型的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3385685/

相关文章:

ruby - 在 Rails 中格式化 float 时间

Haskell: "Cast"/强制类型?

java - 当我转换包含变量的对象时,为什么它不显示变量的值?

python - 为什么 fmod(1.0,0.1) == .1?

php - 比较三个字段

c - 我应该如何输入 cast void *?

floating-point - OCaml 中的 80 位扩展精度浮点

php - 如何在 PHP 中使用爆炸并获取一行中的第一个元素?

php - 防止 DOMDocument::loadHTML() 转换实体

php - 通过 Graph API 将 Facebook 帖子创建为草稿