浅谈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 事件机制(2)
Mar 23 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
php实现的任意进制互转类分享
Jul 07 PHP
php冒泡排序与快速排序实例详解
Dec 07 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
CodeIgniter框架基本增删改查操作示例
Mar 23 PHP
PHP和MYSQL实现分页导航思路详解
Apr 11 PHP
PHPTree――php快速生成无限级分类
Mar 30 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防注
2007/01/15 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
JS中数组重排序方法
2016/11/11 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
Python os模块介绍
2014/11/30 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
师德师风承诺书
2014/05/23 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
银行竞聘报告范文
2014/11/06 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
综合测评个人总结
2015/03/03 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
离婚案件答辩状
2015/05/22 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书