printf%.3f和bc舍入行为之间的差异

时间:2014-10-02 19:36:16

标签: bash printf bc

好的,这是一个黑客问题(https://www.hackerrank.com/challenges/bash-tutorials---arithmetic-operations)。基本上,输入是一个算术表达式,我应该打印出格式化的答案(3位小数)。我一开始就尝试了这个

read exp
echo "scale = 3; $exp" | bc -l

它通过了几次测试,但不是第一次。

5+50*3/20 + (19*2)/7答案是17.929,但我的代码打印出17.928。我试过这个代码

read exp  
printf "%.3f\n" `echo $exp | bc -l`

注意:回声部分应该是反引号,但我放了' '不要与块报价混淆。所有测试都通过了那么差异是什么?

4 个答案:

答案 0 :(得分:5)

两者不同的原因是bc总是切断数字而不是舍入数字。 I. e。 echo "scale = 3 ; 8/9" | bc生成0.888而不是正确舍入的0.889。

您的测试用例评估为17.928571429,使用printf方法舍入为17.929,但使用bc方法切换为17.928。

答案 1 :(得分:2)

我认为问题是scale = 3;部分。例如,如果您使用

      printf "%.3f\n" ` echo  "scale = 3 ; $exp " | bc -l`

你将再次获得17.928。所以答案是你需要将比例设置为至少4,然后将其打印成三位数。

答案 2 :(得分:1)

问题是bc返回舍入和/或有效数字。当echoscale=3一起使用时,您依靠bc仅返回3位数字。当您告诉printf仅输出 3个小数位(使用格式%.3f)时,您依靠printf来确定哪些数字。从本质上讲,不同之处在于bc使用scale=3完成的舍入以及printf使用%.3f转换完成的舍入。

答案 3 :(得分:0)

v=$(sed 's/[[:blank:]]//g')
(echo "scale=4"; echo $v) | bc | xargs printf '%.3f'

上面从stdin中读取整数,删除空白行,将其传递给bc以4位精度执行计算,然后在printf的帮助下将其正确舍入为3位数。我解决了上面提到的HackerRank问题。