当前位置: 首页>>技术教程>>正文


在bash中,如何使用bc舍入小数?

, , ,

问题描述

使用bash脚本编写我想要的简单示例:

#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
echo "scale=2; $float/1.18" |bc -l
read -p "Press any key to continue..."
bash scriptname.sh

假设价格是:48.86答案是:41.406779661(41.40实际上因为我使用的是scale=2;)

我的问题是:我如何围绕第二个小数点以这种方式显示答案?:41.41

最佳解决方案

bash圆函数:

round()
{
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};

在您的代码示例中使用:

#!/bin/bash
# the function "round()" was taken from 
# http://stempell.com/2009/08/rechnen-in-bash/

# the round function:
round()
{
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};

echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
#echo "scale=2; $float/1.18" |bc -l
echo $(round $float/1.18 2);
read -p "Press any key to continue..."

祝你好运:o)

次佳解决方案

最简单的解决方案

printf %.2f $(echo "$float/1.18" | bc -l)

第三种解决方案

Bash /awk舍入:

echo "23.49" | awk '{printf("%d\n",$1 + 0.5)}'  

如果你有python你可以使用这样的东西:

echo "4.678923" | python -c "print round(float(raw_input()))"

第四种方案

这是一个纯粹的bc解决方案。舍入规则:+/- 0.5,远离零。

把你想要的量表放在$ result_scale;你的数学应该是$ MATH在bc命令列表中的位置:

bc <<MATH
h=0
scale=0

/* the magnitude of the result scale */
t=(10 ^ $result_scale)

/* work with an extra digit */
scale=$result_scale + 1

/* your math into var: m */
m=($MATH)

/* rounding and output */
if (m < 0) h=-0.5
if (m > 0) h=0.5

a=(m * t + h)

scale=$result_scale
a / t
MATH

第五种方案

我知道这是一个老问题,但我有一个纯粹的’bc’解决方案没有’if’或分支:

#!/bin/sh
bcr()
{
    echo "scale=$2+1;t=$1;scale-=1;(t*10^scale+((t>0)-(t<0))/2)/10^scale" | bc -l
}

bcr '2/3' 5bcr '0.666666' 2一样使用它 – > (表达式后跟比例)

这是可能的,因为在bc(如C /C++)中,它允许在计算中混合逻辑表达式。根据’t’的符号,表达式((t>0)-(t<0))/2)将评估为+/- 0.5,因此使用正确的值进行舍入。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2869.html,未经允许,请勿转载。