好的,这是一个黑客问题(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`
注意:回声部分应该是反引号,但我放了' '不要与块报价混淆。所有测试都通过了那么差异是什么?
答案 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
返回舍入和/或有效数字。当echo
与scale=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问题。