PHP bc系列函数(高精度数学运算)
简介:bc系列函数用于处理任意精度的十进制计算,适用于金融、科学计算等对精度要求极高的场景。需启用bcmath
扩展(可通过phpinfo()
检查是否启用)。
特点:
- 所有参数和返回值均为字符串类型(避免精度丢失)
- 支持自定义小数位数(scale参数)
- 提供基本运算、比较、幂运算等完整功能
一、基础运算函数
1. 加法:bcadd()
// 语法:bcadd(左操作数, 右操作数, 保留小数位数)
echo bcadd('123.456', '78.9', 2); // 202.36(123.456 + 78.9 = 202.356,保留2位小数)
echo bcadd('100', '200', 0); // 300(整数相加)
2. 减法:bcsub()
// 语法:bcsub(被减数, 减数, 保留小数位数)
echo bcsub('100.5', '30.25', 1); // 70.2(100.5 - 30.25 = 70.25,保留1位小数)
echo bcsub('50', '75', 0); // -25(负数结果)
3. 乘法:bcmul()
// 语法:bcmul(乘数1, 乘数2, 保留小数位数)
echo bcmul('2.5', '4.2', 2); // 10.50(2.5 × 4.2 = 10.5,保留2位小数)
echo bcmul('100', '0.01', 0); // 1(整数与小数相乘)
4. 除法:bcdiv()
// 语法:bcdiv(被除数, 除数, 保留小数位数)
echo bcdiv('10', '3', 3); // 3.333(10 ÷ 3 ≈ 3.3333...,保留3位)
var_dump(bcdiv('5', '0', 0)); // false(除数为0时返回false)
5. 取模(余数):bcmod()
// 语法:bcmod(被除数, 除数)
echo bcmod('10', '3'); // 1(10 ÷ 3 余数为1)
echo bcmod('7.5', '2.5'); // 0.0(7.5 是 2.5 的整数倍)
二、比较函数
bccomp()
// 语法:bccomp(值1, 值2, 比较精度)
// 返回值:1(值1 > 值2)、0(相等)、-1(值1 < 值2)
echo bccomp('10', '10', 0); // 0(相等)
echo bccomp('10.5', '10.49', 1); // 1(10.5 > 10.49,精确到1位小数)
echo bccomp('5.999', '6', 2); // -1(5.999 < 6,精确到2位小数)
三、幂运算与开方
1. 幂运算:bcpow()
// 语法:bcpow(底数, 指数, 保留小数位数)
echo bcpow('2', '3', 0); // 8(2³ = 8)
echo bcpow('1.2', '2', 2); // 1.44(1.2² = 1.44)
2. 幂运算取模:bcpowmod()
// 语法:bcpowmod(底数, 指数, 模数, 保留小数位数)
// 作用:(base^exponent) % modulus,比先算幂再取模更高效
echo bcpowmod('3', '3', '5', 0); // 2(3³=27,27%5=2)
3. 开平方:bcsqrt()
// 语法:bcsqrt(数值, 保留小数位数)
echo bcsqrt('25', 0); // 5(√25 = 5)
echo bcsqrt('2', 4); // 1.4142(√2 ≈ 1.4142,保留4位)
var_dump(bcsqrt('-4', 0)); // false(负数无法开平方)
四、全局配置函数
bcscale()
// 功能:设置所有bc函数的默认小数位数(全局生效)
bcscale(2); // 全局默认保留2位小数
echo bcadd('1', '2'); // 3.00(使用全局配置)
echo bcsub('5', '3.5'); // 1.50(自动补全2位小数)
echo bcadd('1', '2', 0); // 3(局部参数优先级高于全局)
关键注意事项
- 参数类型:必须传入字符串(如
'123.45'
),而非数字(避免自动转换导致精度丢失)。 - 返回值:始终为字符串,需转换类型时用
(float)
或(int)
。 - 扩展依赖:需在
php.ini
中启用extension=bcmath
(重启服务生效)。 - 精度优先级:函数的
scale
参数 >bcscale()
全局配置。
通过这些函数,PHP可以实现高精度计算,解决普通数值类型精度不足的问题。
评论 (0)