PHP浮点数计算函数不四舍五入

本文探讨了PHP中浮点数运算的精度问题,并提出了使用bcadd、bcsub、bcmul、bcdiv等函数结合round函数进行精确计算的方法,解决了直接截断小数位数而不四舍五入的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP浮点数计算函数不四舍五入

之前做统计模块时,遇到PHP计算精度的问题,比如:

$a = 2586;
$b = 2585.98;

var_dump($a-$b);
//期望的结果是:float(0.02)
//实际结果:
float(0.019999999999982)

之后统一换成加bcadd() 、减 bcsub() 、 乘bcmul() 、除 bcdiv()等计算方法,然后又发现第三个参数的保留小数位数是直接截取,不进行四舍五入,比如:

$a = 1186;
$b = 865;
$ab = 2051;
//两个值相加结果是2051
//然后我们来计算百分比
$a_rate = bcdiv($a,$ab,3);
$b_rate = bcdiv($b,$ab,3);
//$a_rate = 0.578
//$b_rate = 0.421

很明显0.578跟0.421相加不等于1,所以还得对浮点数计算的函数进行修改

/**
 * 修改bcadd方法,避免直接截取小数位不四舍五入的问题
 * @param Float $left_value 加号左边数
 * @param Float $right_value 加号右边数
 * @param Int $decimal_places 保留小数位,默认0
 * @return Float 返回结果
 */
function round_bcadd($left_value,$right_value,$decimal_places=0){
    return round(bcadd($left_value,$right_value,bcadd($decimal_places,2)),$decimal_places);
}
/**
 * 修改bcsub方法,避免直接截取小数位不四舍五入的问题
 * @param Float $left_value 减号左边数
 * @param Float $right_value 减号右边数
 * @param Int $decimal_places 保留小数位,默认0
 * @return Float 返回结果
 */
function round_bcsub($left_value,$right_value,$decimal_places=0){
    return round(bcsub($left_value,$right_value,bcadd($decimal_places,2)),$decimal_places);
}
/**
 * 修改bcmul方法,避免直接截取小数位不四舍五入的问题
 * @param Float $left_value 乘号左边数
 * @param Float $right_value 乘号右边数
 * @param Int $decimal_places 保留小数位,默认0
 * @return Float 返回结果
 */
function round_bcmul($left_value,$right_value,$decimal_places=0){
    return round(bcmul($left_value,$right_value,bcadd($decimal_places,2)),$decimal_places);
}
/**
 * 修改bcdiv方法,避免直接截取小数位不四舍五入的问题
 * @param Float $left_value 分子
 * @param Float $right_value 分母
 * @param Int $decimal_places 保留小数位,默认0
 * @return Float 返回结果
 */
function round_bcdiv($left_value,$right_value,$decimal_places=0){
    return round(bcdiv($left_value,$right_value,bcadd($decimal_places,2)),$decimal_places);
}

借助PHP的round方法,浮点数计算的时候把保留小数位多加两位,然后用round根据实际需求位数进行四舍五入,OK问题完美解决

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值