简单谈谈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 相关文章推荐
ie6 动态缩略图不显示的原因
Jun 21 PHP
PHP 一个随机字符串生成代码
May 26 PHP
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
php 常用算法和时间复杂度
Jul 01 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
ThinkPHP5框架缓存查询操作分析
May 30 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PDO::commit讲解
Jan 27 PHP
简单的php购物车代码
Jun 05 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多维数组的深度的方法
2014/01/07 PHP
php自定义session示例分享
2014/04/22 PHP
php提交post数组参数实例分析
2015/12/17 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
python2.7的编码问题与解决方法
2016/10/04 Python
pandas去除重复列的实现方法
2019/01/29 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
python3 re返回形式总结
2020/11/20 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
智能旅行箱:Horizn Studios
2018/04/30 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
有个性的自我评价范文
2013/11/15 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
教育专业自荐书范文
2013/12/17 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
党员岗位承诺书
2014/03/25 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
Python中常见的导入方式总结
2021/05/06 Python
Python+Tkinter制作专属图形化界面
2022/04/01 Python