php数学扩展bcmath

我在这里准备了一百口棺材,九十九口留给贪官,一口留给自己。

问题引出

看下面这个代码片段的结果

1
2
$res1 = 0.07 * 100 == 7;
dump($res1); // false

结果竟然是 false
这个和电脑中存储小数的原理有关。大家都知道计算机只能存储0和1,我们日常生活习惯使用的是10进制的数据,像0.07这个小数在计算机中存储时会有精度损失.

问题解决

1
2
$res2 = bcmul(0.07, 100) == 7;
dump($res2); // true

BC 数学 函数
● bcadd — 2个任意精度数字的加法计算
● bccomp — 比较两个任意精度的数字
● bcdiv — 2个任意精度的数字除法计算
● bcmod — 对一个任意精度数字取模
● bcmul — 2个任意精度数字乘法计算
● bcpow — 任意精度数字的乘方
● bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
● bcscale — 设置所有bc数学函数的默认小数点保留位数
● bcsqrt — 任意精度数字的二次方根
● bcsub — 2个任意精度数字的减法

实例

1
2
3
4
5
6
<?php
$re = intval(18.99*100)/100;
echo $re;
echo "<br>";
$gg = bcdiv(bcmul('18.99','100'), '100',2);
echo $gg;

http://php.net/manual/zh/book.bc.php