PHP 保留小数点后有效数字(四舍五入)

/**
 * 四舍五入保留有效数字
 * $val 需要保留的数值 必填
 * $num 需要保留的位数 必填
 * $s 开始位置 不需要填
 * $d 结束位置 不需要填
 */
function keepValidNumbers($val, $num, $s = 1, $d = 1) {
    $result = round($val, $s);
    if ($result == 0 && $num > $d) {
        return keepValidNumbers($val, $num, ++$s, $d);
    } else if($num > $d) {
        return keepValidNumbers($val, $num, ++$s, ++$d);
    } else {
        return $result;
    }
}

解决的问题是:

round()函数是保留小数点后N位,我的需求是保留小数点后N位有效数字,如0.001111111,round()的结果为0.0011,我需要的结果是0.001111

有效数字的含义:从该数的第一个非零数字起,直到末尾数字止的数字称为有效数字,如0.618的有效数字有三个,分别是6,1,8
本作品采用《CC 协议》,转载必须注明作者和本文链接
xylp
讨论数量: 31

round() 函数本身不就是对浮点数进行四舍五入嘛,为何还要递归一下计算呢?

1年前 评论
小李世界 1年前
xylp (楼主) 1年前

bcadd('3.222514584785', 0, 4)

1年前 评论
Tacks 1年前
Darwin 1年前
xylp (楼主) 1年前

sprintf("%0.4f",3.222554584785) 不也是可以四舍五入吗?如果要float的格式,用 floatval($num) 转换一下不也可以么

1年前 评论
xylp (楼主) 1年前
Junwind

同问,这种咋还用到递归

1年前 评论
xylp (楼主) 1年前

重复造轮子?

1年前 评论
xylp (楼主) 1年前
DonnyLiu

同问楼上的问题,round函数本身就是用于浮点数四舍五入的

1年前 评论
xylp (楼主) 1年前

round($number, 2)

1年前 评论
xylp (楼主) 1年前

没有必要

1年前 评论
xylp (楼主) 1年前

trim(round($number, 2), '0')

1年前 评论
xylp (楼主) 1年前

rtrim(round(0.001111, 4), '0')

1年前 评论
xylp (楼主) 1年前
JerryBool (作者) 1年前
$count = 4;
$a = 1.0012345;
preg_match('/\d+\.(0*[1-9]{0,'.($count+1).'})/',$a,$res);
$b = round($res[0],strlen($res[1]) -1);
1年前 评论
xylp (楼主) 1年前

楼主是对的,

1年前 评论

楼主的意思是 保留小数点后(除 0 意外)有效位数

round 是保留小数点后有效位数

如果按楼主意思, 数据库应该怎么设计? 小数点位数不确定

1年前 评论
xylp (楼主) 1年前
tigeryang 1年前
kis龍 (作者) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!