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

时间:2016-06-03 15:50:05

标签: php

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

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

因此任意精度保持不变

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

我被指向How to round down to the nearest significant figure in php,它很接近但不适用于N位有效数字,我不确定它对0.000XXX数字的作用

3 个答案:

答案 0 :(得分:5)

要将数字舍入为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 = ($decimalPlaces > 0) ?
        number_format($value, $decimalPlaces) : round($value, $decimalPlaces);
    return $answer;
}

这将给出以下内容:
0.0001234567返回0.0001235
123456.7返回123500

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

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

containerView2

现在1显示为1.000

答案 1 :(得分:1)

对可能重复的修改很少,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;
}

答案 2 :(得分:0)

要使 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 将结果以科学记数法表示为所需的有效位数。