【问题标题】:How to display number to two decimal places in bash function如何在bash函数中将数字显示到小数点后两位
【发布时间】:2012-11-29 18:09:52
【问题描述】:

我应该如何取一个以百秒为单位的数字并以秒为单位显示到小数点后两位?遵循 dTime 函数的伪代码我不确定,但我想你会得到我的目标。

function time {
    echo "$(date +%N)/10000000"
}

function dTime {
    echo "($1/100).(${$1:${#1}-3:${#1}-1})"
}

T=$time
sleep 2
T=$dTime T

【问题讨论】:

标签: linux bash


【解决方案1】:

以下可以做到2位小数精度,

echo $T | bc -l | xargs printf "%.2f"

【讨论】:

    【解决方案2】:

    Bash 有一个内置的 printf 函数:

    printf "%0.2f\n" $T
    

    【讨论】:

    • 请注意 printf 取决于区域设置!例如,在 Fr 中,',' 在语言环境中用于浮点分隔,而不是 '.'。所以在Fr, printf "%0.2f\n" 26.600 会返回错误(数字必须表示为"26,600")
    【解决方案3】:

    下面将date +%N的输出除以1000000000,将结果四舍五入到小数点后两位,并将结果赋给变量T

    printf -v T "%.2f" $(bc -l <<< "$(date +%N)/1000000000")
    

    如果你只是想打印这些东西,

    bc <<< "scale=2; $(date +%N)/1000000000"
    

    如果您不喜欢bc 并想使用dc(因为它是反向抛光,所以使用起来更轻、更有趣),

    dc <<< "2 k $(date +%N) 1000000000 / p"
    

    注意区别,printf 将具有前导 0,而不是 bcdcprintfbc(或dc)之间还有另一个区别:printf 将最接近的数字四舍五入到小数点后两位,而bc(或dc)四舍五入到小数点后两位。如果您想要后一种行为并将结果分配给变量T,您可以使用,例如,

    T=$(dc <<< "2 k $(date +%N) 1000000000 / p")
    

    或者,如果您还想要前导 0

    T=0.$(dc <<< "2 k $(date +%N) 1000000000 / p")
    

    【讨论】:

      【解决方案4】:

      "bc" 和 "dc" 都是截断而不是舍入,所以现在我更喜欢 Perl

      如果“N”中有你的百分之几秒,那么:

      $ perl -e "printf('%.2f', $N/100)"
      

      我从来都不是 Perl 的支持者,但它现在无处不在,我终于习惯于使用它而不是 sed/awk 等。

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多