简单谈谈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 获得汉字拼音首字母的函数
Aug 01 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
php使用curl抓取qq空间的访客信息示例
Feb 28 PHP
PHP生成随机密码类分享
Jun 25 PHP
thinkphp普通查询与表达式查询实例分析
Nov 24 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
Dec 15 PHP
php插件Xajax使用方法详解
Aug 31 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 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 db类库进行数据库操作
2009/03/19 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
Python用GET方法上传文件
2015/03/10 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python实现下载文件的三种方法
2017/02/09 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python实现超市扫码仪计费
2018/05/30 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python for 循环获取index索引的方法
2019/02/01 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Delphi工程师笔试题
2013/09/21 面试题
前厅收银主管岗位职责
2014/02/04 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
结婚保证书
2015/01/16 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
2015入党自传书范文
2015/06/26 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
python APScheduler执行定时任务介绍
2022/04/19 Python