【问题标题】:Why rounding error in bash?为什么在bash中舍入错误?
【发布时间】:2017-01-12 14:25:39
【问题描述】:
5+50*3/20 + (19*2)/7 = 17.9285714286
                     = 17.929

我想通过执行以下 bash 操作获得截断到小数点后 3 位的确切值,即17.929

echo " scale = 3; 5+50*3/20 + (19*2)/7 " | bc

但它给了我17.928的价值。

$ echo " scale = 3; 5+50*3/20 + (10*9)/7 " | bc
17.928

我能做什么??

注意:这是Hackerrank challenge。即使它没有在他们的控制台中提供正确的输出。

【问题讨论】:

    标签: bash arithmetic-expressions bc


    【解决方案1】:

    bc 是十进制值的上限,而不是四舍五入。您可以使用 awk:

    awk 'BEGIN{printf "%.3f\n", 5+50*3/20 + (19*2)/7}'
    17.929
    

    【讨论】:

    • 非常感谢!它正在工作!但是,如何处理变量?我的意思是,awk 'BEGIN{printf "%.3f\n", $a}' 给出了输出0.000
    • 在这种情况下,您可以使用:s='5+50*3/20 + (19*2)/7'; awk 'BEGIN{printf "%.3f\n",'"$s"'}'
    【解决方案2】:

    当您在bc 中使用scale=3 时,您不仅要指定输出中的小数位数,还要限制bc 用于进行计算的小数位数。

    要获得正确的输出,请使用printfbc

    $ printf '%.3f\n' "$(bc -l <<<'5+50*3/20 + (19*2)/7')"
    17.929
    

    如果表达式在变量$var 内,请将单引号中的字符串替换为"$var"

    【讨论】:

      猜你喜欢
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2022-12-08
      • 1970-01-01
      相关资源
      最近更新 更多