我想格式化(圆形)浮点数(双精度)数字,例如 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 以科学记数法将结果表示为所需的有效位数。