一个PHP版本的四舍六入五留双的算法,支持保留任意位小数

分享一个PHP版本的四舍六入五留双的算法,支持保留任意位小数 。

<?php

function my_round($value, $len = 0)
{
    bcscale(18);
    // 转化成高精度
    $value = bcsub($value, 0);
    // 乘以幂指数
    $value_power = bcmul($value, bcpow(10, $len));
    // 判断正负号
    $flag = bccomp($value_power, 0);
    // 根据正负,确定要比较的数
    $cmp = $flag >= 0 ? 0.5 : -0.5;
    // 整数部分
    $value_power_int = bcsub($value_power, 0, 0);
    // 小数部分
    $diff = bccomp(
        bcsub($value_power, $value_power_int),
        $cmp
    );

    // 正数 大于0.5 入
    if ($flag > 0 && $diff > 0) {
        // +入
        $value_power_int = bcadd($value_power_int, 1);
    } elseif ($flag < 0 && $diff < 0) {
        // 负数 小于-0.5 入
        // -入
        $value_power_int = bcadd($value_power_int, -1);
    } elseif (!$diff) {
        // 5留双
        $mod = bcmod($value_power_int, 2, 0);
        if ($mod == 1) {
            // 正数留双
            $value_power_int = bcadd($value_power_int, 1);
        } elseif ($mod == -1) {
            // 负数留双
            $value_power_int = bcadd($value_power_int, -1);
        }
    } else {
        //舍
    }

    return bcdiv($value_power_int, bcpow(10, $len), $len);
}

echo '保留0位小数-整数';
echo '<br />0.00 ≈ '.my_round(0.00, 0);
echo '<br />1.49 ≈ '.my_round(1.49, 0);
echo '<br />1.500000 ≈ '.my_round(1.500000, 0);
echo '<br />1.500001 ≈ '.my_round(1.500001, 0);
echo '<br />1.6 ≈ '.my_round(1.6, 0);
echo '<br />2.49 ≈ '.my_round(2.49, 0);
echo '<br />2.500000 ≈ '.my_round(2.500000, 0);
echo '<br />2.500001 ≈ '.my_round(2.500001, 0);
echo '<br />2.59 ≈ '.my_round(2.59, 0);
echo '<br />2.6 ≈ '.my_round(2.6, 0);
echo '<br />-1.49 ≈ '.my_round(-1.49, 0);
echo '<br />-1.500000 ≈ '.my_round(-1.500000, 0);
echo '<br />-1.500001 ≈ '.my_round(-1.500001, 0);
echo '<br />-1.6 ≈ '.my_round(-1.6, 0);
echo '<br />-2.49 ≈ '.my_round(-2.49, 0);
echo '<br />-2.500000 ≈ '.my_round(-2.500000, 0);
echo '<br />-2.500001 ≈ '.my_round(-2.500001, 0);
echo '<br />-2.59 ≈ '.my_round(-2.59, 0);
echo '<br />-2.6 ≈ '.my_round(-2.6, 0);

echo '<br /><br />保留1位小数';
echo '<br />0.00 ≈ '.my_round(0.00, 1);
echo '<br />0.149 ≈ '.my_round(0.149, 1);
echo '<br />0.1500000 ≈ '.my_round(0.1500000, 1);
echo '<br />0.1500001 ≈ '.my_round(0.1500001, 1);
echo '<br />0.16 ≈ '.my_round(0.16, 1);
echo '<br />0.249 ≈ '.my_round(0.249, 1);
echo '<br />0.2500000 ≈ '.my_round(0.2500000, 1);
echo '<br />0.2500001 ≈ '.my_round(0.2500001, 1);
echo '<br />0.259 ≈ '.my_round(0.259, 1);
echo '<br />0.26 ≈ '.my_round(0.26, 1);
echo '<br />-0.149 ≈ '.my_round(-0.149, 1);
echo '<br />-0.1500000 ≈ '.my_round(-0.1500000, 1);
echo '<br />-0.1500001 ≈ '.my_round(-0.1500001, 1);
echo '<br />-0.16 ≈ '.my_round(-0.16, 1);
echo '<br />-0.249 ≈ '.my_round(-0.249, 1);
echo '<br />-0.2500000 ≈ '.my_round(-0.2500000, 1);
echo '<br />-0.2500001 ≈ '.my_round(-0.2500001, 1);
echo '<br />-0.259 ≈ '.my_round(-0.259, 1);
echo '<br />-0.26 ≈ '.my_round(-0.26, 1);

// 
echo '<br /><br />保留到百位';
echo '<br />3550 ≈ '.my_round(3550, -2);
echo '<br />3650 ≈ '.my_round(3650, -2);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值