我正在编写一个简单的bash脚本,默认情况下计算平方根为3个小数位,但是用户可以设置位数。没什么复杂的,我只是从1迭代到最低的平方根。由于我的重击仍然很基本,所以这就是我想出的。
#!/usr/bin/env bash
num=${1}
places=${2-3}
i=0
while [[ $(( i*i )) -lt ${num} ]] // <= The problem should be here
do
i=$(( i + 1 ))
done
echo ${i};
rem=$(( num % i ))
root="${i}."
for (( j=0; j<places; j++ ))
do
rem=$((rem * 10))
root="$root$((rem / i))"
rem=$((rem % i))
done
echo ${root}
但是由于某种原因,它不能对许多数字产生正确的结果,例如bashfile.sh 9 // will produce 3.000 but bashfile.sh 8 will return 3.666
友好的帮助,这有什么问题while [[ ]]
这是一个相当简单的解决方案,尽管不是很有效:
#!/bin/bash
num=$1
prec=${2:-3}
for (( i=0; i < prec; ++i )); do let num*=100; done
for (( sqrt=0; sqrt*sqrt <= num; ++sqrt )); do :; done
let --sqrt
sqrt="${sqrt:0:-prec}.${sqrt: -prec}"
echo $sqrt
为了回答您的问题(“问题出在哪里while [[ ]]
”),您的比较有点不正确。而不是-lt
(<
应该)应该是<=
。而且您需要i
在循环后减去1,以获得正确的平方根完整部分。
我无法理解计算小数位的代码的第二部分。但是,一个简单的解决方案是将原始数字预乘以获取所需的精度,这就是我上面所做的。
更新
正如@ dash-o指出的,如果您使用的是bash,则很可能安装了bc或awk,这更适合于此操作:
num=$1
prec=${2:-3}
# using bc
echo "scale=$prec; sqrt($num)" | bc
# using awk
awk "BEGIN {printf \"%.${prec}f\n\", sqrt($num)}"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句