浅谈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
用文本文件制作留言板提示(下)
Oct 09 PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php UBB 解析实现代码
Nov 27 PHP
php数组合并的二种方法
Mar 21 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
php实现微信支付之退款功能
May 30 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 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
第一个无线电台是由谁发明的
2021/03/01 无线电
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
javascript 实现map集合
2015/04/03 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python Flask基础教程示例代码
2018/02/07 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
C语言50道问题
2014/10/23 面试题
临床医学专业学生的自我评价分享
2013/11/21 职场文书
销售辞职报告范文
2014/01/12 职场文书
餐饮营销方案
2014/02/23 职场文书
电子专业自荐信
2014/07/01 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
2014年售票员工作总结
2014/11/19 职场文书
水电工岗位职责
2015/02/14 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
二年级作文之动物作文
2019/11/13 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android