分享一个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);