简单谈谈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
建站常用13种PHP开源CMS比较
Aug 23 PHP
php短域名转换为实际域名函数
Jan 17 PHP
rrmdir php中递归删除目录及目录下的文件
May 15 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
smarty简单分页的实现方法
Oct 27 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
php-msf源码详解
Dec 25 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
关于Yii中模型场景的一些简单介绍
Sep 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调用C代码的实现方法
2014/03/11 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python中几种导入模块的方式总结
2017/04/27 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
python轮询机制控制led实例
2020/05/03 Python
Python创建临时文件和文件夹
2020/08/05 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
个人授权委托书范本
2014/04/03 职场文书
妇女干部培训方案
2014/05/12 职场文书
体育教师求职信
2014/05/24 职场文书
2014年实习期工作总结
2014/11/27 职场文书
员工年终考核评语
2014/12/31 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android