为什么在 bash 中出现舍入误差?

Why rounding error in bash?

5+50*3/20 + (19*2)/7 = 17.9285714286
                     = 17.929

我想通过执行以下 bash 操作来获得截断到小数点后 3 位的精确值,即 17.929

echo " scale = 3; 5+50*3/20 + (19*2)/7 " | bc

但它给了我价值17.928

$ echo " scale = 3; 5+50*3/20 + (10*9)/7 " | bc
17.928

我能做什么??

N.B.: 这是一个Hackerrank challenge。即使它没有在他们的控制台中给出正确的输出。

bc 是小数的上限而不是四舍五入。你可以使用 awk:

awk 'BEGIN{printf "%.3f\n", 5+50*3/20 + (19*2)/7}'
17.929

当您在 bc 中使用 scale=3 时,您不仅指定了输出中的小数位数,还限制了 bc 的小数位数用于计算。

要获得正确的输出,请使用 printfbc:

$ printf '%.3f\n' "$(bc -l <<<'5+50*3/20 + (19*2)/7')"
17.929

如果表达式在变量 $var 内,请将单引号中的字符串替换为 "$var"