我想格式化(圆形)浮点数(双数字)让我们说出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数字的作用
答案 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 将结果以科学记数法表示为所需的有效位数。