一、常见问题

用 PHP 做计算时经常会遇到精度带来的问题,下面来看两个常见的例子:

1. 运算比较

下面表达式输出的结果不是相等:

echo 2.01 - 0.01 == 2 ? '相等' : '不相等'; // 不相等

2. 类型转换

下面表达式输出的结果不是201(如果想输出你想要的结果,需要先转 string 再转 int):

$num = intval(2.01 * 100);

var_dump($num); // int(200)

你也许会觉得很奇怪,然而这并不是 PHP 的 bug,如果想深入了解可以参考鸟哥的两篇文章:

二、BC MATH

用 PHP 提供的 BC MATH 系列数学函数可以解决上面的问题。对于任意精度的数学计算, BC MATH 提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为2147483647-1(或0x7FFFFFFF-1)。

下面用 BC MATH 提供的函数解决上面的问题。

1. 运算比较

bccomp — 比较两个任意精度的数字:

$num = bccomp(2.01 - 0.01, 2, 2);

var_dump($num); // int(0)

注:如果两个数相等返回 0, 左边的数比较右边的数大返回 1, 否则返回-1。

2. 类型转换

bcmul — 2个任意精度数字乘法计算:

$num = bcmul(2.01, 100, 0);

var_dump($num); // string(3) "201"

var_dump(intval($num)); // int(201)

注:返回结果为字符串类型

使用 BC MATH 系列数学函数可以让我们减少失误,避免不必要的错误,如需查看详细参数和其它函数的使用,请查阅 PHP 官方文档:http://php.net/manual/zh/book.bc.php

本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。

php 数学基础,PHP 基础篇 - PHP 的 BC MATH 系列数学函数相关推荐

  1. 【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)

    今天封装了一个Line类.负责在昨天写的窗体上绘制线条. OpenGL画图是通过给glBegin函数设置參数达成的,绘制线条有三个不同的參数: GL_LINES : 绘制连接两个点的线段(绘制的端点位 ...

  2. JAVA基础篇【工具类】MathUtil 数学运算辅助类TG【20130324整理】

    数学运算辅助类,希望对大家有所帮助 import java.math.BigDecimal; /** * 数学运算辅助类. * * @author Elfy * @date 2013年03月21日 * ...

  3. 0513JS基础:数组内置方法、数学函数、时间函数

    |数组中常用的内置方法 |-push()与pop() |--push()是往数组的尾部添加,同时返回新数组的长度 var attr = [1,2,3,4,5];var attr2 = [6,7,8,9 ...

  4. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  5. SQL Server调优系列基础篇(联合运算符总结)

    前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...

  6. Nginx实战基础篇一 源码包编译安装部署web服务器

    Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...

  7. Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛

    Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览. ...

  8. 计算声学·物理基础篇1

    计算声学 @rz_wen 第一部分·物理基础 流体力学 符号说明 c i j k i , j , k = 1 , 2 , 3 c_{ijk} \qquad i,j,k=1,2,3 cijk​i,j,k ...

  9. Linux中w r x数学代码,Linux bc命令实现数学计算器

    bash shell 内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc 命令可以很方便的进行浮点运算,当然整数运算也不再话下. bc 甚至可以称得上是一种编程语言了,它支持变量.数组 ...

最新文章

  1. Silverlight调用本机exe程序
  2. Spring 3整合Quartz 2实现定时任务--转
  3. SAP CDS view里将Date和time连接成timestamp的函数
  4. WebSocket数据加密——AES与RSA混合加密
  5. 15 并发编程-(IO模型)
  6. python设计要求_Python高级应用程序设计任务要求
  7. filedisk学习资料
  8. Linux正在更新缓存卡住,Linux 进程卡住了怎么办?
  9. 自定义垂直方向滑动的ViewGroup
  10. 静态分析Android程序
  11. CTFWeb——Bugku秋名山老司机 详细题解
  12. 体验车联网,你选对物联网卡了吗?
  13. 乐吾乐2D可视化之智慧城市可视化(一)
  14. 夜神模拟器连接手柄无反应_夜神安卓模拟器连接手柄的具体操作方法介绍
  15. 2020计算机保研经历
  16. FleaPHP 域名事件搞笑版
  17. 芯洲电源,一款可以升压降压DCDC开关稳压电源,车规级面世,文章是参数详解
  18. 裁判文书关键信息提取
  19. 在System.Timers.Timer的处理程序中调用MessageBox.Show()弹出的确是非模态的
  20. 计算机丢失UxTheme无法修复,win7电脑系统开机提示uxtheme.dll丢失怎么办

热门文章

  1. 2021年CSP-S初赛试题
  2. SimpleDet专栏开篇(热门目标检测框架)
  3. SpringBoot实现身份证实名认证(阿里云实现)
  4. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
  5. Chrome 浏览器翻译插件划词翻译
  6. 远程连接阿里云服务器数据库
  7. 没正常关机自动修复此计算机咋办,Win10非正常关机使用自动修复陷入无限重启该怎么办...
  8. BLE Mesh (5) —— Lower Transport Layer
  9. 表头显示后怎么提交php,添加表头工具栏
  10. HTML图片标签列表表格以及合并单元格,个人简历小案例