【问题标题】:bad format decimal in bash script [duplicate]bash脚本中的错误格式十进制[重复]
【发布时间】:2012-10-25 11:00:21
【问题描述】:

可能重复:
How do I get bc(1) to print the leading zero?

我有这个问题:

x=$(echo "0.81+0.02" |bc)
echo $x

结果.83

我想看到 0.83,但我没有成功。

【问题讨论】:

    标签: bash format


    【解决方案1】:

    echo 对浮点数一无所知,它只知道字符串和整数。

    您可以使用printf 处理其他数据类型并指定精确的格式选项:

    printf '%.2f\n' $x
    

    例子:

    imac:barmar $ x=$(echo "0.81+0.02" |bc)
    imac:barmar $ printf '%.2f\n' $x
    0.83
    

    【讨论】:

    • 不简单:-( x=$(echo "0.81+0.02" |bc) printf "$x.2f\n" $x, result 0.00
    • 当你尝试它会发生什么?
    • 应该是'%.2f\n',而不是'$x.2f\n'
    • 请阅读printf的文档,它解释了格式字符串。
    • 您不能将 printf 与赋值放在同一行,它们必须是单独的语句。请参阅我的答案中的示例。
    【解决方案2】:

    最简单的解决方案是将结果附加到已经包含“0”字符的字符串中。

    x=0
    x+=$(echo "0.81+0.02" |bc)
    echo $x
    

    如果您希望能够处理数字可能大于 1 的情况,您可以改用参数替换

    x=$(echo "1.81+0.02" | bc )
    x=${x/^./0.}
    echo $x
    

    很遗憾,前面的代码不起作用。第二行的意思是用字符串0. 替换第一个字符(如果是点),但显然我犯了语法错误。我对正则表达式不是很了解,但这应该正是您正在寻找的。​​p>

    下面的方法比较麻烦,但可以防御。

    x=$(echo "1.81+0.02" | bc )
    if [[ $x == .* ]]; then
       x=0$x
    fi
    

    【讨论】:

    • $ x=0 $ x=$(echo "$x+0.81+0.02" |bc) $ echo $x -> 结果 0.83 ok。但。 $ x=0 $ x+=$(echo "1.81+0.02" |bc) $ echo $x ->result 01.83 ->错误格式。 01.83
    • 查看我的其他编辑,这次有效。
    【解决方案3】:

    只需一行:

    printf '%.2f\n' $(echo 0.82+0.01 | bc)
    

    或

    echo 0.82+0.01 | printf '%.2f\n' $(bc)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2013-12-29
      • 2016-05-21
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多