脚本和浮点分区

Moa*_*tou 44 bash shell

我想在我的脚本中执行以下操作:

1 - ((m - 20) / 34)
Run Code Online (Sandbox Code Playgroud)

我想将此操作的结果分配给另一个变量.我希望我的脚本使用浮点数学.例如,对于m = 34:

results = 1 - ((34 - 20) / 34) == 0.588
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 53

你可以使用bc计算器.如果你将increease设置scale为默认值0 ,它将使用小数(不是二进制浮点)进行任意精度数学运算:

$ m=34
$ bc <<< "scale = 10; 1 - (($m - 20) / 34)"
.5882352942
Run Code Online (Sandbox Code Playgroud)

-l选项将加载标准数学库并将比例默认为20:

$ bc -l <<< "1 - (($m - 20) / 34)"
.58823529411764705883
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用printf格式化输出,如果您选择:

printf "%.3f\n" "$(bc -l ...)"
Run Code Online (Sandbox Code Playgroud)


jor*_*anm 26

Bash不做浮点数学运算.您可以使用awk或bc来处理此问题.这是一个awk例子:

$ m=34; awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }'
0.588235
Run Code Online (Sandbox Code Playgroud)

要将输出分配给变量:

var=$(awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }')
Run Code Online (Sandbox Code Playgroud)


Cyr*_*rus 19

教bash例如带浮点结果的整数除法:

#!/bin/bash

div ()  # Arguments: dividend and divisor
{
        if [ $2 -eq 0 ]; then echo division by 0; exit; fi
        local p=12                            # precision
        local c=${c:-0}                       # precision counter
        local d=.                             # decimal separator
        local r=$(($1/$2)); echo -n $r        # result of division
        local m=$(($r*$2))
        [ $c -eq 0 ] && [ $m -ne $1 ] && echo -n $d
        [ $1 -eq $m ] || [ $c -eq $p ] && return
        local e=$(($1-$m))
        let c=c+1
        div $(($e*10)) $2
}  

    result=$(div 1080 633)                  # write to variable
    echo $result

    result=$(div 7 34)
    echo $result

    result=$(div 8 32)
    echo $result

    result=$(div 246891510 2)
    echo $result

    result=$(div 5000000 177)
    echo $result
Run Code Online (Sandbox Code Playgroud)

输出:

    1.706161137440
    0.205882352941
    0.25
    123445755
    28248.587570621468
Run Code Online (Sandbox Code Playgroud)


小智 9

echo $a/$b|bc -l
Run Code Online (Sandbox Code Playgroud)

给出结果.

例:

read a b
echo $a/$b|bc -l
Run Code Online (Sandbox Code Playgroud)

输入&b值为10 3,得到3.3333333333

如果要将值存储在另一个变量中,请使用该代码

read a b
c=`echo $a/$b|bc -l`
echo $c
Run Code Online (Sandbox Code Playgroud)

它也给出了与上面相同的结果.试试吧...