浅谈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用户指南-cookies部分
Oct 09 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
php中批量删除Mysql中相同前缀的数据表的代码
Jul 01 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
详解Yii2 rules 的验证规则
Dec 02 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
jQuery 源码分析笔记
2011/05/25 PHP
header跳转和include包含问题详解
2012/09/08 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
javascript 必知必会之closure
2009/09/21 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
python3.4实现邮件发送功能
2018/05/28 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
python制作图片缩略图
2019/04/30 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
经理秘书岗位职责
2013/11/14 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
关于赌博的检讨书
2014/01/08 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
学生操行评语大全
2014/04/24 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
读后感作文评语
2014/12/25 职场文书
雷锋观后感
2015/06/10 职场文书
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python