如何在Bash中浮动? (到十进制)

时间:2014-04-30 13:20:43

标签: bash

我想对我的浮点变量进行舍入,以使这些变量的总和相等1.这是我的程序:

for float in 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25; do
w1=`echo "1.0 - $float" | bc -l`   
w2=`echo "$w1/3" | bc -l`
echo "$w2 0.0 $w2 0.0 0.0 0.0 $w2 $float 0.0 0.0 0.0 0.0"
done

总和3*$w2 + $float必须为1.00。 我是初学者,但我需要这个来计算一些结果。

我已经尝试过我在互联网上发现的w2轮,但我没有设法让它发挥作用。它必须是四舍五入而不是截断,最终结果为1.00。

4 个答案:

答案 0 :(得分:2)

bc允许您使用变量,因此您可以说:

for float in 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25; do 
    { read w2; read f; } < <(
        bc -l <<< "scale=5; w2=(1.0-$float)/3; w2; 1.0-3*w2"
    )
    echo "$w2 0.0 $w2 0.0 0.0 0.0 $w2 $f 0.0 0.0 0.0 0.0"
done
.33333 0.0 .33333 0.0 0.0 0.0 .33333 .00001 0.0 0.0 0.0 0.0
.33300 0.0 .33300 0.0 0.0 0.0 .33300 .00100 0.0 0.0 0.0 0.0
.33000 0.0 .33000 0.0 0.0 0.0 .33000 .01000 0.0 0.0 0.0 0.0
.32500 0.0 .32500 0.0 0.0 0.0 .32500 .02500 0.0 0.0 0.0 0.0
.31666 0.0 .31666 0.0 0.0 0.0 .31666 .05002 0.0 0.0 0.0 0.0
.30833 0.0 .30833 0.0 0.0 0.0 .30833 .07501 0.0 0.0 0.0 0.0
.30000 0.0 .30000 0.0 0.0 0.0 .30000 .10000 0.0 0.0 0.0 0.0
.29166 0.0 .29166 0.0 0.0 0.0 .29166 .12502 0.0 0.0 0.0 0.0
.28333 0.0 .28333 0.0 0.0 0.0 .28333 .15001 0.0 0.0 0.0 0.0
.27500 0.0 .27500 0.0 0.0 0.0 .27500 .17500 0.0 0.0 0.0 0.0
.26666 0.0 .26666 0.0 0.0 0.0 .26666 .20002 0.0 0.0 0.0 0.0
.25833 0.0 .25833 0.0 0.0 0.0 .25833 .22501 0.0 0.0 0.0 0.0
.25000 0.0 .25000 0.0 0.0 0.0 .25000 .25000 0.0 0.0 0.0 0.0

根据需要调整scale=?

答案 1 :(得分:1)

根据您在OP中的评论,您认为可以接受更改float变量以使其总和等于1.在此情况下,首先计算w2和然后从那里重新计算浮点数:

w2=$(bc -l <<< "(1-($float))/3")
float=$(bc -l <<< "1-3*($w2)")

整个事情,用更好的风格写成:

floats=( 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 )
for float in "${floats[@]}"; do
    w2=$(bc -l <<< "(1-($float))/3")
    float=$(bc -l <<< "1-3*($w2)")
    printf "%s 0.0 %s 0.0 0.0 0.0 %s %s 0.0 0.0 0.0 0.0\n" "$w2" "$w2" "$w2" "$float"
done

这使用bc -l提供的精度(小数点后20位小数)。如果您不想要这种准确性,可以在重新计算w2之前围绕float进行四舍五入:

floats=( 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 )
for float in "${floats[@]}"; do
    w2=$(bc -l <<< "scale=3; (1-($float))/3")
    float=$(bc <<< "1-3*($w2)")
    printf "%s 0.0 %s 0.0 0.0 0.0 %s %s 0.0 0.0 0.0 0.0\n" "$w2" "$w2" "$w2" "$float"
done

请注意,最后bc未使用-l选项进行调用:它将使用w2中的任何有效数字。更改scale以满足您的需求。因此,保证您的号码加起来为1,因为您可以从上一个片段的输出中查看:

.333 0.0 .333 0.0 0.0 0.0 .333 .001 0.0 0.0 0.0 0.0
.333 0.0 .333 0.0 0.0 0.0 .333 .001 0.0 0.0 0.0 0.0
.330 0.0 .330 0.0 0.0 0.0 .330 .010 0.0 0.0 0.0 0.0
.325 0.0 .325 0.0 0.0 0.0 .325 .025 0.0 0.0 0.0 0.0
.316 0.0 .316 0.0 0.0 0.0 .316 .052 0.0 0.0 0.0 0.0
.308 0.0 .308 0.0 0.0 0.0 .308 .076 0.0 0.0 0.0 0.0
.300 0.0 .300 0.0 0.0 0.0 .300 .100 0.0 0.0 0.0 0.0
.291 0.0 .291 0.0 0.0 0.0 .291 .127 0.0 0.0 0.0 0.0
.283 0.0 .283 0.0 0.0 0.0 .283 .151 0.0 0.0 0.0 0.0
.275 0.0 .275 0.0 0.0 0.0 .275 .175 0.0 0.0 0.0 0.0
.266 0.0 .266 0.0 0.0 0.0 .266 .202 0.0 0.0 0.0 0.0
.258 0.0 .258 0.0 0.0 0.0 .258 .226 0.0 0.0 0.0 0.0
.250 0.0 .250 0.0 0.0 0.0 .250 .250 0.0 0.0 0.0 0.0

答案 2 :(得分:0)

您必须使用bc实用程序来处理bash中的浮点数。

例如,考虑下面给出的代码,

a=15
b=2
echo "$a / $b" 

将为您提供 7

在哪里,

a=15
b=2
echo "$a / $b" | bc -l

7.500000 作为结果

答案 3 :(得分:0)

您可以使用printf来舍入bc的输出:

printf '%.2f\n' $( bc -l <<< "3 * $w2 + $float" )