简单谈谈php浮点数精确运算


Posted in PHP onMarch 10, 2016

bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值。这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string。

bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减

首先看一段代码:

<?php
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);

打印出来的值居然为 boolean false

这是为啥?PHP手册对于浮点数有以下警告信息:

Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数

那么上面的算式我们应该改写为

<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);

这样就能解决浮点数的计算问题了

PHP 相关文章推荐
PHP新手上路(十四)
Oct 09 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
php实现源代码加密的方法
Jul 11 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
thinkphp实现图片上传功能
Jan 13 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
Mar 10 #PHP
Zend Framework教程之Loader以及PluginLoader用法详解
Mar 09 #PHP
php注册登录系统简化版
Dec 28 #PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 #PHP
Zend Framework教程之Autoloading用法详解
Mar 08 #PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 #PHP
php bootstrap实现简单登录
Mar 08 #PHP
You might like
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python调用fortran模块
2016/04/08 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
实例介绍Python中整型
2019/02/11 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
为数据库创建索引都需要注意些什么
2012/07/17 面试题
医学毕业生自我鉴定
2013/10/30 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
同事离别感言
2015/08/04 职场文书