简单谈谈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垃圾回收机制简单说明
Jul 22 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
Apr 18 PHP
PHP中常用的魔术方法
Apr 28 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
详解php与ethereum客户端交互
Apr 28 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
详解Laravel框架的依赖注入功能
May 27 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实现自动登入google play下载app report的方法
2014/09/23 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
javascript实现简单的html5视频播放器
2015/05/06 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
Django框架实现的分页demo示例
2019/05/25 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
开办加工厂创业计划书
2014/01/03 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers