简单谈谈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 相关文章推荐
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP 5.3.0 安装分析心得
Aug 07 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
thinkphp实现多语言功能(语言包)
Mar 04 PHP
php调用shell的方法
Nov 05 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 PHP
php TP5框架生成二维码链接
Apr 01 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操作csv文件代码实例汇总
2014/09/22 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python中常见的异常总结
2018/02/20 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python各层级目录下import方法代码实例
2020/01/20 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
签约仪式策划方案
2014/06/02 职场文书
大学生学习计划书
2014/09/15 职场文书
学前班学生评语
2014/12/29 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
消防安全主题班会
2015/08/12 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏