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

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

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

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

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

bcadd('3.222514584785', 0, 4)

1年前 评论
Tacks 1年前
Darwin 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年前

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