bc算术错误

krr*_*ish 7 math arithmetic-expressions bc

我正在尝试解决这个bash脚本,该脚本从用户读取算术表达式并将其回显到输出屏幕,最后向上舍入3个小数位.

样本输入

5+50*3/20 + (19*2)/7
Run Code Online (Sandbox Code Playgroud)

样本输出

17.929
Run Code Online (Sandbox Code Playgroud)

我的代码是

read x
echo "scale = 3; $x" | bc -l
Run Code Online (Sandbox Code Playgroud)

当有输入时

5+50*3/20 + (19*2)/7
Run Code Online (Sandbox Code Playgroud)

**我的输出是**

17.928
Run Code Online (Sandbox Code Playgroud)

机器想要它

17.929
Run Code Online (Sandbox Code Playgroud)

由于这个原因我得到了错误的解决方案.任何的想法 ?

sle*_*vy1 5

这里的关键是确保将 printf 与“%.3f”的格式规范一起使用,并且只要 bc 的“scale=4”,printf 就会按照你的意愿进行四舍五入。

这是一个有效的脚本:

echo -e "please enter math to calculate: \c"
read x
printf "%.3f\n" $(echo "scale=4;$x" | bc -l)
Run Code Online (Sandbox Code Playgroud)

如果在命令行中运行此命令,您可以了解上述解决方案的情况:echo "scale=4;5+50*3/20 + (19*2)/7" | bc结果将为 17.9285。当该结果作为参数提供给 printf 时,该函数会考虑第四位小数并将该值四舍五入,以便格式化的结果显示为精确的三位小数,并且值为 17.929。

或者,这也可以在没有管道的情况下通过将 here 文档重定向为 bc 的输入来工作,如下避免创建子 shell:

echo -e "please enter math to calculate: \c"
read x
printf "%.3f\n" $(bc -l <<< "scale=4;$x")
Run Code Online (Sandbox Code Playgroud)