【问题标题】:Convert (integer,precision) pair to a float in bash/bc将(整数,精度)对转换为 bash/bc 中的浮点数
【发布时间】:2012-08-31 15:05:37
【问题描述】:

我有两个数字,$value 和 $precision。我需要对这些数字进行“浮点”表示(当然输出实际上是一个字符串,因为这是 bash)。

$precision 告诉我这个数字应该有多少个小数点。

例子:

  $value=123, $precision=2

这应该给出输出“1.23”。

如何从 Bash 优雅地做到这一点?我正在查看“bc”手册页,但我并没有真正看到任何方法。我假设最简单的方法是将我的输入值视为字符串并插入 char '.'以某种方式处于正确的位置。

【问题讨论】:

    标签: bash shell bc


    【解决方案1】:

    bc:

    bc <<EOF
    scale = $precision
    $value / (10 ^ $precision)
    EOF
    

    sed:

    sed -e "s/[0-9]\{$precision\}$/.&/" <<< "$value"
    

    【讨论】:

    • 我将使用 sed 解决方案,至少我可以阅读并理解这一点。 bc 表达式在 Solaris 10 上给了我以下错误:第 1 行的语法错误,电传打字
    • @Jolta:对不起,我在测试时大脑冻结了,我从 'scale' 行中删除了 '=' 作为通过尝试修复(在我意识到我没有设置bash 变量,如果你需要知道的话)。在点击提交之前我没有修复它。
    【解决方案2】:

    好的,所以我找到了一些对 Bash 的字符串操作帮助......这可以解决问题,但它并不漂亮。在这里发布以供后代使用。

    lastIndex=$((${#value}-1))
    dotIndex=$((${#value}-$precision))
    decvalue=${value:0:$dotIndex}.${value:$dotIndex:$lastIndex}
    

    【讨论】:

    • 你真的不需要反引号或回声;您可以只使用:decvalue="${value:0:$precision}.${value:$last}",其中双引号也是可选的。另外,这不是给12.3而不是1.23吗?
    • 谢谢!我的表达有问题,实际上给了我 1.3 ......但现在它给了我 12.3,就像你说的那样。有什么建议可以扭转这种局面吗?
    • 好的,我认为这可以解决问题。但是很丑!另一方面,我的整个脚本使用 sed 解决方案在 ca 0.190s 中运行,而使用这个丑陋的解决方案在 ca 0.180s 中运行! ;-)
    • 好吧,我希望您每次使用此脚本时都能充分利用额外的 1/100 秒 :) 您修改后的版本看起来就像我要组装的一样。我注意到bash 可以从 Perl 学习中受益,负偏移意味着“从字符串末尾”可以很方便(它可以为您节省一些计算)。
    • 好吧,如果我每分钟运行 n 次脚本......它仍然是 O(n)。没关系。
    猜你喜欢
    • 2014-01-30
    • 2020-02-03
    • 1970-01-01
    • 2015-06-12
    • 2013-04-16
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多