PHP unexpected result of float to int type cast(浮点到 int 类型转换的 PHP 意外结果)
问题描述
我试图在 php 中将浮点数转换为 int 值:
var_dump((int)(39.3 * 100.0));//返回3929但应该是3930!var_dump((int)(39.2 * 100.0));//返回3920
我可以使用 ceil 使其工作,但有人可以向我解释一下吗?
var_dump((int)ceil(39.3 * 100.0));//返回3930
解决方案这是因为以 10 为底的有限表示的数字在 PHP 使用的浮点表示中可能有也可能没有精确表示.
见
<前>>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"字符串(45) "3929.9999999999995452526491135358810424804688"
由于 int
总是将数字向下舍入,因此表示中的一个小错误会使转换将其向下舍入一个您所期望的数字.
考虑使用 round
代替.
I'trying to convert a float to an int value in php:
var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920
I can use ceil to make it work but can somebody explain this to me?
var_dump((int)ceil(39.3 * 100.0)); //Returns 3930
This is because numbers that have a finite representation in base 10 may or may not have an exact representation in the floating point representation PHP uses.
See
>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));" string(45) "3929.9999999999995452526491135358810424804688"
Since int
always rounds the number down, a small error in the representation makes the cast round it one number down that you would otherwise expect.
Consider using round
instead.
这篇关于浮点到 int 类型转换的 PHP 意外结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:浮点到 int 类型转换的 PHP 意外结果
基础教程推荐
- PHP 守护进程/worker 环境 2022-01-01
- 找不到类“AppHttpControllersDB",我也无法使用新模型 2022-01-01
- 如何在 Symfony 和 Doctrine 中实现多对多和一对多? 2022-01-01
- 在 CakePHP 2.0 中使用 Html Helper 时未定义的变量 2021-01-01
- Doctrine 2 - 在多对多关系中记录更改 2022-01-01
- 使用 PDO 转义列名 2021-01-01
- 在 yii2 中迁移时出现异常“找不到驱动程序" 2022-01-01
- 如何在 XAMPP 上启用 mysqli? 2021-01-01
- HTTP 与 FTP 上传 2021-01-01
- phpmyadmin 错误“#1062 - 密钥 1 的重复条目‘1’" 2022-01-01