浅谈PHP强制类型转换,慎用!


Posted in PHP onJune 06, 2013

PHP是一门弱类型的语言。这是它的优势和特点,但是有的时候你又不得不对类型进行相应的转换。

这个时候问题就来了。因为很多情况下,你会发现转换类型之后得到的数据和预期的值相差老大一截。

这里我以强制转换为整形作为例子。

看下面的代码,可以说你绝对不可能说出正确的答案。
echo (int) 123.999999999999999;
echo (int)   -1.999999999999999;
echo (int)   -1.9999999999999999;
echo (int)   -0.99999999999999999;
echo (int)  -10.999999999999999;
echo (int) -1000.9999999999999;
echo (int) -9999999999;

下面来看看我得到的结果。

首先要说明下我的系统环境。win7 X86

得到的结果如下

124
 -1
 -2
 -1
 -10
 -1001
 -1410065407

官方给出的说法是:

当从浮点数转换成整数时,将向零取整。

如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

说了这么多,总结就一句话:精度不够关我鸟事!

看到这里,你可能会认为我上面举的例子有点牵强。因为根本不可能用到那么高的精度。

那么,我们来看下面的这个例子。

echo (int) ( (0.1+0.7) * 10 );

不用猜了,这里的执行结果是---7!

对,你没看错,我也没敲错,结果是 7 ,而不是我们通常认为的 8 。

现在,你知道PHP有多么操蛋了吧!

PHP官方有这么一句警告:

决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。

所以在进行强制类型转换的时候一定要慎重!大数值,高精度,分数都要慎用!

当然,上面的那个例子可以这样来处理。
x$num = (0.1 + 0.7) * 10;
echo (int) $num;

PHP 相关文章推荐
PHP中显示格式化的用户输入
Oct 09 PHP
PHP文件上传实例详解!!!
Jan 02 PHP
PHP insert语法详解
Jun 07 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
php创建sprite
Feb 11 PHP
php GUID生成函数和类
Mar 10 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
php开发微信支付获取用户地址
Oct 04 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
PHP自定义错误用法示例
Sep 28 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 #PHP
$_GET['goods_id']+0 的使用详解
Jun 06 #PHP
PHP编码规范的深入探讨
Jun 06 #PHP
PHP输出XML到页面的3种方法详解
Jun 06 #PHP
PHP转换文件夹下所有文件编码的实现代码
Jun 06 #PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 #PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 #PHP
You might like
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
python求素数示例分享
2014/02/16 Python
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python opencv实现证件照换底功能
2019/08/19 Python
python中的global关键字的使用方法
2019/08/20 Python
如何把python项目部署到linux服务器
2020/08/26 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
会计电算化学生个人的自我评价
2014/02/08 职场文书
大学秋游活动方案
2014/02/11 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
党员干部承诺书范文
2014/03/25 职场文书
校园安全演讲稿
2014/05/09 职场文书
双拥工作宣传标语
2014/06/26 职场文书
小学数学教研活动总结
2014/07/01 职场文书
开平碉楼导游词
2015/02/06 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android