在 PHP 中将数字格式设置为 N 位有效数字



我想格式化(圆形)浮点数(双精度)数字,例如 2 位有效数字:

1        => 1
11       => 11
111      => 110
119      => 120
0.11     => 0.11
0.00011  => 0.00011
0.000111 => 0.00011

所以任意精度保持不变

我希望它已经内置了一些不错的功能,但到目前为止找不到任何功能

有人指出如何向下舍入到php中最接近的有效数字,该数字很接近,但不适用于N位有效数字,我不确定它对0.000XXX数字的作用

要获得四舍五入为 n 个有效数字的数字,您需要找到以 10 的幂为单位的数字的大小,然后从 n 中减去它。

这适用于简单的舍入:

function sigFig($value, $digits)
{
    if ($value == 0) {
        $decimalPlaces = $digits - 1;
    } elseif ($value < 0) {
        $decimalPlaces = $digits - floor(log10($value * -1)) - 1;
    } else {
        $decimalPlaces = $digits - floor(log10($value)) - 1;
    }
    $answer = round($value, $decimalPlaces);
    return $answer;
}

这将提供以下内容:
0.0001234567 返回 0.0001235
123456.7返回123500

但是,诸如 10 到 4 个有效数字之类的值应严格表示为 10.00,以表示该值已知的精度。

如果这是所需的输出,则可以使用以下输出:

function sigFig($value, $digits)
{
    if ($value == 0) {
        $decimalPlaces = $digits - 1;
    } elseif ($value < 0) {
        $decimalPlaces = $digits - floor(log10($value * -1)) - 1;
    } else {
        $decimalPlaces = $digits - floor(log10($value)) - 1;
    }
    $answer = ($decimalPlaces > 0) ?
        number_format($value, $decimalPlaces) : round($value, $decimalPlaces);
    return $answer;
}

现在 1 显示为 1.000

对可能的重复项几乎没有修改,由Todd Chaffee回答:

public static function roundRate($rate, $digits)
{
    $mod = pow(10, intval(round(log10($rate))));
    $mod = $mod / pow(10, $digits);
    $answer = ((int)($rate / $mod)) * $mod;
    return $answer;
}

要使 sigFig(0.9995, 3) 输出 1.00,请使用

if(floor(log10($value)) !== floor(log10(round($value, $decimalPlaces)))) {$decimalPlaces--;}

在声明$answer之前,应放置上述代码行。

如果输入$value为负数,则设置一个标志并删除函数开头的符号,如下所示:

if($value <0){$flag = 1;}$value = ltrim($value, "-");

然后在返回$answer之前,检测是否设置了标志,如果是,则恢复负号,如下所示:

if(isset($flag)){$answer = "-".$answer;}

最后,对于有效位数不明确(例如,1000、12000,...)的结果值,使用 sprintf 或 printf 以科学记数法将结果表示为所需的有效位数。

最新更新