简单谈谈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 相关文章推荐
利用js调用后台php进行数据处理原码
Oct 09 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
PHP图像处理类库及演示分享
May 17 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
PHP反射实际应用示例
Apr 03 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数据缓存技术
2007/02/14 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
python实现人机五子棋
2020/03/25 Python
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
自我评价格式
2014/01/06 职场文书
工程质量承诺书范文
2014/03/27 职场文书
博士生导师推荐信
2014/07/08 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
朋友聚会开场白
2015/06/01 职场文书
bose降噪耳机音能消除人声吗
2022/04/19 数码科技