是否可以使用BASH / bc / printf将浮点数舍入到第一个有效数字?

时间:2015-05-08 03:08:32

标签: bash math printf rounding bc

我已经找到有关将浮点数舍入到特定小数位数的信息,方法是使用带有BC和'%。xf'的'scale'使用printf,但是如果我使用的数字并不总是像我在下面显示的那样具有相同的格式,有没有办法将它舍入到不是零的第一个小数位?

例如,假设我有一个这样的数字列表:

0.0008234535225
0.00547889294
0.000003243322

我有办法将它们转换成这样的东西吗?:

0.0008
0.005
0.000003

我遇到的每一个Google结果都在谈论四舍五入到特定数字的数字而不是第一个有效数字,而我在搜索结果中过滤它们并没有太大的成功,所以它正在弄清楚这一点问题完全靠我自己有点困难。

有人可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:4)

以下内容会将您的号码截断为第一个非0数字:

grep -o "0.0*." <<< "$NUMBER"

例如:

grep -o "0.0*." <<< "0.000003243322"

打印:

0.000003

答案 1 :(得分:1)

如果您愿意将这些值作为字符串处理,则可以使用一些参数扩展:

$ 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

答案 2 :(得分:0)

可以直接在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