【问题标题】:Is it possible to use BASH/bc/printf to round a float to its first significant figure?是否可以使用 BASH/bc/printf 将浮点数舍入到其第一个有效数字?
【发布时间】:2015-07-18 20:30:54
【问题描述】:

我发现 tonstons 的信息关于通过使用 'scale' 与 BC 和 '%.xf' 将浮点数舍入到特定的小数位数使用 printf,但是如果我使用的数字并不总是具有如下所示的相同格式,有没有办法将它四舍五入到小数点后第一个不为零的位?

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

0.0008234535225
0.00547889294
0.000003243322

有没有办法让我把它们转换成这样的东西?:

0.0008
0.005
0.000003

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

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

【问题讨论】:

  • 0.000003943322 的输出应该是什么?
  • 您所说的possible 是什么意思?我猜您必须分别检查每个值,并在“计算”前导 0 之后将 x 设置为 %xf。一个有趣的问题,但我没有看到批量解决方案。祝你好运!
  • @higuaro 输出将是“0.000003”,但如果您知道将其四舍五入为“0.000004”的解决方案,那也可以。另外,我的意思是可能的,BASH/bc/printf 是否真的有能力做到这一点,还是我必须使用其他工具?

标签: bash math printf rounding bc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    $ 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
    

    【讨论】:

      【解决方案3】:

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

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

      例如:

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

      打印:

      0.000003
      

      【讨论】:

      • 考虑这些输入:'0.1.000''0..1'
      • 该问题未指定有关处理无效格式数字的任何内容。事实上,OP 明确表示他正在处理0.000...[non-zero-digit][digit] 形式的数字
      • 好的。也就是说,可以通过考虑除了 OP 之外的其他访问者寻找类似解决方案的案例来改进关于 SO 的答案。
      • 0.000003943322 的输出应该是什么”如果所需的输出是 0.000004,这可以工作:sed -r 's|(0\.0*)(.)(.*)|t=\2/\1\2\;scale=l(t)/l(10)\;(&amp;*t+0.5)/t|' &lt;&lt;&lt; 0.000003943322 | bc。我知道,OP想要截断。这里是四舍五入的解决方案,仅供参考。
      • @anishsane 我得到Runtime error (func=(main), adr=13): Function l not defined. ?
      猜你喜欢
      • 2015-01-07
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多