PHP 基础篇 - PHP 的 BC MATH 系列数学函数
2017-12-15 00:00
134 查看
一、常见问题
用 PHP 做计算时经常会遇到精度带来的问题,下面来看两个常见的例子:1. 运算比较
下面表达式输出的结果不是相等:
<?php echo 2.01 - 0.01 == 2 ? '相等' : '不相等'; // 不相等
2. 类型转换
下面表达式输出的结果不是201(如果想输出你想要的结果,需要先转 string 再转 int):
<?php $num = intval(2.01 * 100); var_dump($num); // int(200)
你也许会觉得很奇怪,然而这并不是 PHP 的 bug,如果想深入了解可以参考鸟哥的两篇文章:
关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)
PHP浮点数的一个常见问题的解答
二、BC MATH
用 PHP 提供的 BC MATH 系列数学函数可以解决上面的问题。对于任意精度的数学计算, BC MATH 提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为2147483647-1(或0x7FFFFFFF-1)。下面用 BC MATH 提供的函数解决上面的问题。
1. 运算比较
bccomp — 比较两个任意精度的数字:<?php $num = bccomp(2.01 - 0.01, 2, 2); var_dump($num); // int(0)
注:如果两个数相等返回 0, 左边的数比较右边的数大返回 1, 否则返回-1。
2. 类型转换
bcmul — 2个任意精度数字乘法计算:<?php $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
本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma
相关文章推荐
- PHP 基础篇 - PHP 的 BC MATH 系列数学函数
- php学习基础篇之基础函数(数学 日期 字符串)、php循环流程控制
- php中BC math 高精度数学函数
- 4. PHP 载入图像 imagecreatefrom_gif_jpeg_png 系列函数
- 使用ob系列函数实现PHP网站页面静态化
- PHP基础系列之字符串——字符串常用函数的分类
- php页面缓存ob系列函数介绍
- PHP使用BC Math 函数处理浮点运算问题
- [thrift]用于php服务端的header系列函数
- php杂谈【基础篇】之_10.常用函数
- PHP 常用数学计算内部函数 (Mathematical Functions)
- php 四舍五入 数学函数
- php ob(output buffering)系列函数详解
- php数学函数--4舍5入函数--php 产生随机数--php取最小、大值--php进一法取整--php舍去法取整
- php页面缓存ob系列函数介绍
- PHP常用数组函数系列--array_column
- PHP中ob系列函数整理
- php常用数学函数汇总
- PHP关于ob_系列函数的学习总结