PHP 精确运算函数bcadd,bcsub,bcmul,bcdiv

php 在使用加减乘除等运算符计算的时候会把未定义类型的操作数转成浮点数然后进行算术运算

有句话说的好,永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数

浮点数运算示例

1
2
3
$a = '49';
$v = '48.98';
echo $a - $v;

正常来讲这里应该返回 0.2 吧,可实际运行结果是 0.020000000000003

php提供了高精度计算的函数库,实际上就是为了解决这个浮点数计算问题而生的

使用之前要先安装扩展:
apt install bc-math

加法 bcadd

(PHP 4, PHP 5, PHP 7)

bcadd — 2个任意精度数字的加法计算

1
2
3
4
5
6
7
8
<?php
$a = '1.894';
$b = '5';

echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.8940
echo bcadd($a, $b, 1); // 6.8
?>

减法 bcsub

(PHP 4, PHP 5, PHP 7)

bcsub — 2个任意精度数字的减法

1
2
3
4
5
6
7
<?php
$a = '1.234';
$b = '5';

echo bcsub($a, $b); // -3
echo bcsub($a, $b, 4); // -3.7660
?>

乘法 bcmul

(PHP 4, PHP 5, PHP 7)

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

1
2
3
4
<?php
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>

除法 bcdiv

(PHP 4, PHP 5, PHP 7)

bcdiv — 2个任意精度的数字除法计算

1
2
3
<?php
echo bcdiv('105', '6.55957', 3); // 16.007
?>

注:超出精度范围的部分,会被直接丢弃。