简单谈谈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.ini 中文版
Oct 28 PHP
php UTF8 文件的签名问题
Oct 30 PHP
在MongoDB中模拟Auto Increment的php代码
Mar 06 PHP
深入理解curl类,可用于模拟get,post和curl下载
Jun 08 PHP
关于PHPDocument 代码注释规范的总结
Jun 25 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
总结对比php中的多种序列化
Aug 28 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 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
文件系统基本操作类
2006/11/23 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
Bootstrap每天必学之js插件
2015/11/30 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
从零开始封装自己的自定义Vue组件
2018/10/09 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
python实现二叉树的遍历
2017/12/11 Python
简单实现python收发邮件功能
2018/01/05 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
宿舍打麻将检讨书
2014/01/24 职场文书
培训班主持词
2014/03/28 职场文书
国际商务专业求职信
2014/07/15 职场文书
商务经理岗位职责
2014/08/03 职场文书
代收款委托书范本
2014/10/01 职场文书
团代会开幕词
2015/01/28 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
bose降噪耳机音能消除人声吗
2022/04/19 数码科技