是否可以使用 BASH/bc/printf 将浮点数四舍五入到其第一个有效数字?
Is it possible to use BASH/bc/printf to round a float to its first significant figure?
我找到了 tons 和 tons 关于使用 [=27 将浮点数舍入到特定小数位数的信息=] 与 BC 和 '%.xf' 与 printf,但如果我使用的数字并不总是具有相同的格式,如下所示,有没有办法将它四舍五入到第一个小数位不是零吗?
例如,假设我有一个这样的数字列表:
0.0008234535225
0.00547889294
0.000003243322
有没有办法让我把它们转换成这样的东西?:
0.0008
0.005
0.000003
我遇到的每个 Google 结果都在谈论四舍五入到特定位数而不是第一个有效数字,我在从搜索结果中过滤它们方面没有取得太大成功,所以完全靠我自己解决这个问题有点困难。
有人能给我指出正确的方向吗?
以下会将您的号码截断为第一个非 0
数字:
grep -o "0.0*." <<< "$NUMBER"
例如:
grep -o "0.0*." <<< "0.000003243322"
打印:
0.000003
如果您愿意将这些值作为字符串处理,您可以使用一些参数扩展:
$ cat x
0.0008234535225
0.00547889294
0.000003243322
0.00012034
$ for line in $(<x); do
> exp="${line%%[^0.]*}" mant="${line#$exp}"
> echo "${exp}${mant:0:1}"
> done
0.0008
0.005
0.000003
0.0001
可以直接在 shell 中完成,无需任何外部工具:
$ n=0.0008234535225; echo "${n%"${n#*[^0.,+-]}"}"
0.0008
或定义为函数:
$ f(){ for i do echo "${i%"${i#*[^0.,+-]}"}"; done; }
$ f 0.0008234535225 0.00547889294 0.000003243322
0.0008
0.005
0.000003
它也处理负数(或带有正号或带有德国,
):
$ f -0.0008234535225 -0.00547889294 -0.000003243322
-0.0008
-0.005
-0.000003
我找到了 tons 和 tons 关于使用 [=27 将浮点数舍入到特定小数位数的信息=] 与 BC 和 '%.xf' 与 printf,但如果我使用的数字并不总是具有相同的格式,如下所示,有没有办法将它四舍五入到第一个小数位不是零吗?
例如,假设我有一个这样的数字列表:
0.0008234535225
0.00547889294
0.000003243322
有没有办法让我把它们转换成这样的东西?:
0.0008
0.005
0.000003
我遇到的每个 Google 结果都在谈论四舍五入到特定位数而不是第一个有效数字,我在从搜索结果中过滤它们方面没有取得太大成功,所以完全靠我自己解决这个问题有点困难。
有人能给我指出正确的方向吗?
以下会将您的号码截断为第一个非 0
数字:
grep -o "0.0*." <<< "$NUMBER"
例如:
grep -o "0.0*." <<< "0.000003243322"
打印:
0.000003
如果您愿意将这些值作为字符串处理,您可以使用一些参数扩展:
$ cat x
0.0008234535225
0.00547889294
0.000003243322
0.00012034
$ for line in $(<x); do
> exp="${line%%[^0.]*}" mant="${line#$exp}"
> echo "${exp}${mant:0:1}"
> done
0.0008
0.005
0.000003
0.0001
可以直接在 shell 中完成,无需任何外部工具:
$ n=0.0008234535225; echo "${n%"${n#*[^0.,+-]}"}"
0.0008
或定义为函数:
$ f(){ for i do echo "${i%"${i#*[^0.,+-]}"}"; done; }
$ f 0.0008234535225 0.00547889294 0.000003243322
0.0008
0.005
0.000003
它也处理负数(或带有正号或带有德国,
):
$ f -0.0008234535225 -0.00547889294 -0.000003243322
-0.0008
-0.005
-0.000003