浅谈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显示MySQL数据的三种方法
Jun 05 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
YII Framework框架教程之国际化实现方法
Mar 14 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 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二维数组排序详解
2013/11/06 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
php导入模块文件分享
2015/03/17 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
使用Apache的rewrite
2021/03/09 Servers
用JS控制回车事件的代码
2011/02/20 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python遍历类中所有成员的方法
2015/03/18 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
python中删除某个元素的方法解析
2019/11/05 Python
python如何求圆的面积
2020/07/01 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
生产厂厂长岗位职责
2013/12/25 职场文书
兵马俑导游词
2015/02/02 职场文书
明星邀请函
2015/02/02 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis