浅谈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环境搭建最新方法
Sep 05 PHP
配置php网页显示各种语法错误
Sep 23 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
php备份数据库类分享
Apr 14 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
PHP设计模式之原型模式定义与用法详解
Apr 03 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 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和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
js原型链原理看图说明
2012/07/07 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
会计大学生职业生涯规划书范文
2014/01/13 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
中学总务处工作总结
2015/08/12 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python