浅谈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 相关文章推荐
我的论坛源代码(十)
Oct 09 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php检测url是否存在的方法
Apr 14 PHP
Yii2超好用的日期和时间组件(值得收藏)
May 05 PHP
php 如何获取文件的后缀名
Jun 05 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
PDO::setAttribute讲解
Jan 29 PHP
laravel返回统一格式错误码问题
Nov 04 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
Android面试宝典
2013/08/06 面试题
元旦晚会邀请函
2014/01/27 职场文书
网吧消防安全责任书
2014/07/29 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
导游词之杭州西湖
2019/09/19 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书