简单谈谈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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
php 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
PHP 数组基础知识小结
Aug 20 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
tp5.1 框架join方法用法实例分析
May 26 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开发文档 会员收费1期
2012/08/14 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
yii添删改查实例
2015/11/16 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS作用域深度解析
2016/12/29 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
歌唱比赛获奖感言
2014/01/21 职场文书
保密协议书范本
2014/04/22 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
中秋客户感谢信
2015/01/22 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书