简单谈谈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操作Access类(PHP+ODBC+Access)
Jan 02 PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
php和vue配合使用技巧和方法
May 09 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的面试题集
2006/11/19 PHP
php GD绘制24小时柱状图
2008/06/28 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python thread 并发且顺序运行示例
2009/04/09 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
python爬虫 requests-html的使用
2020/11/30 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
大学本科毕业生的自我鉴定
2013/11/26 职场文书
十佳护士获奖感言
2014/02/18 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
三年级学生期末评语
2014/12/26 职场文书
暑期工社会实践报告
2015/07/13 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
Python实现简繁体转换
2021/06/07 Python
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS