简单谈谈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
使用apache模块rewrite_module (转)
Feb 14 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
探讨fckeditor在Php中的配置详解
Jun 08 PHP
php 批量生成html,txt文件的实现代码
Jun 26 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
使用PHP接受文件并获得其后缀名的方法
Aug 05 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
php-fpm中max_children的配置
Mar 15 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 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.ini中文版
2006/10/09 PHP
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python线程池的实现实例
2013/11/18 Python
pyqt和pyside开发图形化界面
2014/01/22 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
大型车展策划方案
2014/02/01 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js