我想计算几个数字的百分比,最多2个小数位。由于我的总数很高,将其除以100会得到非常小的数字(0.000 ..),因此对于这一步,我的规模为10。 第二步,我将结果数字乘以计算百分比,将小数位设为2,但由于bc使用第一小数位10而被忽略。 这是我的代码:
__EVENTTARGET
如何获得第二个计算结果以遵循比例尺并打印最多2个小数位?
答案 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的全局比例。