浅谈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实现的功能是显示8条基色色带
Oct 09 PHP
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
实用函数2
Nov 08 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 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
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
js实现表单Radio切换效果的方法
2015/08/17 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
深入解析Python中函数的参数与作用域
2016/03/20 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Unicode和Python的中文处理
2017/03/19 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
python和c语言的主要区别总结
2019/07/07 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
省级青年文明号申报材料
2014/05/23 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
项目安全员岗位职责
2015/02/15 职场文书
消防隐患整改通知书
2015/04/22 职场文书
在js中修改html body的样式
2021/11/11 Javascript
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL