Bash script: specify bc output number format

前端 未结 6 1537
北荒
北荒 2020-12-03 15:26

Greetings!

I uses to make some calculations in my script. For example:

bc
scale=6
1/2
.500000

For further usage

相关标签:
6条回答
  • 2020-12-03 15:47

    Just do all your calculations and output in awk:

    float_scale=6
    result=$(awk -v scale=$floatscale 'BEGIN { printf "%.*f\n", scale, 1/2 }')
    

    As an alternative, if you'd prefer to use bc and not use AWK alone or with 'bc', Bash's printf supports floating point numbers even though the rest of Bash doesn't.

    result=$(echo "scale=$float_scale; $*" | bc -q 2>/dev/null)
    result=$(printf '%*.*f' 0 "$float_scale" "$result")
    

    The second line above could instead be:

    printf -v $result '%*.*f' 0 "$float_scale" "$result"
    

    Which works kind of like sprintf would and doesn't create a subshell.

    0 讨论(0)
  • 2020-12-03 16:04
    echo "scale=3;12/7" | bc -q | sed 's/^\\./0./;s/0*$//;s/\\.$//'
    
    0 讨论(0)
  • 2020-12-03 16:06

    In one line:

    printf "%0.6f\n" $(bc -q <<< scale=6\;1/2)
    
    0 讨论(0)
  • 2020-12-03 16:10

    Can you put the bc usage into a little better context? What are you using the results of bc for?

    Given the following in a file called some_math.bc

    scale=6
    output=1/2
    print output
    

    on the command line I can do the following to add a zero:

    $ bc -q some_math.bc | awk '{printf "%08f\n", $0}'
    0.500000
    

    If I only needed the output string to have a zero for formatting purposes, I'd use awk.

    0 讨论(0)
  • 2020-12-03 16:11

    Quick and dirty, since scale only applies to the decimal digits and bc does not seem to have a sprintf-like function:

    $ bc
    scale = 6
    result = 1 / 2
    if (0 <= result && result < 1) {
        print "0"
    }
    print result;
    
    0 讨论(0)
  • 2020-12-03 16:12

    I believe here is modified version of the function:

    float_scale=6
    
    function float_eval()
    {
        local stat=0
        local result=0.0
        if [[ $# -gt 0 ]]; then
            result=$(echo "scale=$float_scale; $*" | bc -q | awk '{printf "%f\n", $0}' 2>/dev/null)
            stat=$?
            if [[ $stat -eq 0  &&  -z "$result" ]]; then stat=1; fi
        fi
        echo $result
        return $stat
    }
    
    0 讨论(0)
提交回复
热议问题