浅谈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 相关文章推荐
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 PHP
几种显示数据的方法的比较
Oct 09 PHP
php过滤危险html代码
Aug 18 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
php权重计算方法代码分享
Jan 09 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP两种快速排序算法实例
Feb 15 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修改时间格式的代码
2011/05/29 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
PHP数组相关函数汇总
2015/03/24 PHP
JS 统计时间
2021/03/09 Javascript
javascript 函数式编程
2007/08/16 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
如何编写jquery插件
2017/03/29 jQuery
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python for循环与range函数的使用详解
2019/03/23 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
应届毕业生如何写求职信
2014/02/16 职场文书
感谢信模板大全
2015/01/23 职场文书
支教个人总结
2015/03/04 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python