bash-脚本和浮点数除法
我想在脚本中执行以下操作:
1 - ((m - 20) / 34)
我想将此操作的结果分配给另一个变量。 我希望我的脚本使用浮点数学。 例如,对于m = 34:
results = 1 - ((34 - 20) / 34) == 0.588
Moad Toutou asked 2020-07-21T01:39:44Z
6个解决方案
53 votes
您可以使用-l计算器。 如果将默认值0设置为scale,它将使用小数(不是二进制浮点数)进行任意精度的数学运算:
$ m=34
$ bc <<< "scale = 10; 1 - (($m - 20) / 34)"
.5882352942
-l选项将加载标准数学库并将默认比例设置为20:
$ bc -l <<< "1 - (($m - 20) / 34)"
.58823529411764705883
然后,您可以使用printf格式化输出,如果您选择这样的话:
printf "%.3f\n" "$(bc -l ...)"
John Kugelman answered 2020-07-21T01:40:25Z
26 votes
Bash不执行浮点运算。 您可以使用awk或bc处理此问题。 这是一个awk示例:
$ m=34; awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }'
0.588235
要将输出分配给变量:
var=$(awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }')
jordanm answered 2020-07-21T01:40:49Z
19 votes
教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
输出:
1.706161137440
0.205882352941
0.25
123445755
28248.587570621468
Cyrus answered 2020-07-21T01:41:14Z
9 votes
echo $a/$b|bc -l
给出结果。
例:
read a b
echo $a/$b|bc -l
输入a&b值作为10 3,您将获得3.3333333333
如果要将值存储在另一个变量中,请使用代码
read a b
c=`echo $a/$b|bc -l`
echo $c
它也给出与上述相同的结果。试试吧...
siraj md answered 2020-07-21T01:41:51Z
0 votes
我知道这是一个旧线程,但是这似乎是一个有趣的项目,无需使用bc或调用递归即可解决。 我敢肯定它可以改进,但是这使我的技能发挥了最大作用。
numerator=5
denominator=7 # - 0 -> returns "undef"
decimal_places=4 # - 0 -> same as echo $(( $numerator / $denominator ))
_result_sign=""
let _dp_exp=10**decimal_places
if [ $denominator -eq 0 ]; then _div_result_int_large=0; else let _div_result_int_large=$((numerator * _dp_exp / denominator)); fi
if [ $_div_result_int_large -lt 0 ]; then let _div_result_int_large=$(( _div_result_int_large * -1 )); _result_sign="-"; fi
let _div_result_int=$((_div_result_int_large / _dp_exp))
let _div_result_mant=$((_div_result_int_large - _div_result_int * _dp_exp))
let _dp_lzeros=$((decimal_places - ${#_div_result_mant}))
printf -v _div_result_mant_padded "%.${_dp_lzeros}d$_div_result_mant"
div_result="$_result_sign$_div_result_int"
if [ $decimal_places -gt 0 ]; then div_result="$_result_sign$_div_result_int.$_div_result_mant_padded"; fi
if [ $denominator -eq 0 ]; then div_result="undef"; fi
echo $div_result
输出示例:
numerator=5
denominator=7
decimal_places=5
-> 0.71428
numerator=250
denominator=13
decimal_places=0
-> 19
numerator=-5
denominator=6
decimal_places=2
-> -0.83
numerator=3
denominator=0 # - uh-oh
decimal_places=2 # - can be anything, in this case
-> undef
wmeitzen answered 2020-07-21T01:42:16Z
-1 votes
使用此脚本通过喜欢的编辑器打开该文件,例如:
$ sudo vim /usr/bin/div
然后粘贴以下代码:
#!/bin/bash
# Author: Danial Rikhteh Garan (danial.rikhtehgaran@gmail.com)
if [[ -z "$1" ]] || [[ -z "$2" ]]; then
echo "Please input two number"
echo "for 100/50 use: div 10 50"
exit 1;
fi
div=$(echo "$1/$2" | bc -l);
echo 0$div | sed 's/[0]*$//g'
现在将其更改为755:
$ sudo chmod 755 /usr/bin/div
现在使用它:
$ div 5 100
0.05
在脚本中,您可以使用以下命令:
var=$(div 5 100);
echo "$var"
minttux answered 2020-07-21T01:42:53Z