简单谈谈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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
php array的学习笔记
May 10 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
PHP中使用BigMap实例
Mar 30 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
tp5.1 实现setInc字段自动加1
Oct 18 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
php中addslashes函数与sql防注入
2014/11/17 PHP
PHP微信支付开发实例
2016/06/22 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
详解Vue之父子组件传值
2019/04/01 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
简单了解python数组的基本操作
2019/11/26 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2014年组织部工作总结
2014/11/14 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
JavaScript 定时器详情
2021/11/11 Javascript