您如何迫使BC遵循这一标准?

时间:2019-03-22 13:23:25

标签: bash calculation bc

我想计算几个数字的百分比,最多2个小数位。由于我的总数很高,将其除以100会得到非常小的数字(0.000 ..),因此对于这一步,我的规模为10。 第二步,我将结果数字乘以计算百分比,将小数位设为2,但由于bc使用第一小数位10而被忽略。 这是我的代码:

__EVENTTARGET

如何获得第二个计算结果以遵循比例尺并打印最多2个小数位?

3 个答案:

答案 0 :(得分:1)

通过printf格式化数字:

printf '%s\t%s\t%.2f\n' "$var" "$num" "$perc" >> ofile

答案 1 :(得分:1)

bc所使用的scale(小数点后的小数位数)的操作取决于所涉及的算术运算。

  

表达式*表达式

     

结果应为两个表达式的乘积。如果a和b是两个表达式的小数位数,则结果的小数位数应为:

     

min(a + b,max(scale,a,b))

     

表达式/表达式

     

结果应为两个表达式的商。结果的小数位数应为小数位数。

这是代码中除法和乘法之间行为不同的原因。

答案 2 :(得分:1)

您可以使用以下“ kludge”来解决此问题:

a=3.2222222222
b=24.30123
foo=$(bc <<< "x = $a * $b; scale=2; (x * 100) / 100;")
echo $foo

此代码将打印出以下输出:

78.30

这里的想法是计算(x * 100) / 100的结果将与$a * $b相同(78.303963332793306 ),但这次将要应用的小数位数为2,实际上将截断小数点后两位的所有内容,使其变为78.30。

由于将另外两个数字相乘而得到的数字的小数位数发生了什么原因,请参阅JRFerguson的答案。

实际上,代码甚至可以更短:

foo=$(bc <<< "scale=2; ($a * $b) / 1")

这是因为您将获得的新数字将继承您专门设置的2的全局比例。