linux 脚本除法,bash-脚本和浮点数除法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值