在PHP中格式化为N位有效数字

Pav*_*oba 7 php

我想格式化(圆)浮点(双)数字,让我们说2位有效数字,例如:

1        => 1
11       => 11
111      => 110
119      => 120
0.11     => 0.11
0.00011  => 0.00011
0.000111 => 0.00011
Run Code Online (Sandbox Code Playgroud)

所以任意精度保持不变

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

我被指向如何向下舍入到最近的有效数字,这是关闭但不适用于N位有效数字,我不知道它对0.000XXX数字有什么作用

Ada*_*ard 6

为了将数字四舍五入为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;
}
Run Code Online (Sandbox Code Playgroud)

这将给出以下结果:
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;
}
Run Code Online (Sandbox Code Playgroud)

现在1显示为1.000