如何让 bc 显示 10 而不是 10.00

Die*_*ego 8 bc

#!/bin/bash 
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt
Run Code Online (Sandbox Code Playgroud)

这只是剧本的一部分,但我认为这足以阐明我的意图。p是一个只有两位小数的变量,所以q应该是一个整数...不过, bc例如,显示10.00而不是10

我该如何解决这个问题?

roa*_*ima 8

scale=0由于确定比例的方式,您不能使用明显的方法来做到这一点。

该文档间接解释了除以 1 足以重置输出以匹配 的值scale,默认为零:

expr1 / expr2 表达式的结果是两个表达式的商。结果的标度是变量标度的值。

p=12.34; echo "($p*100)" | bc
1234.00

p=12.34; echo "($p*100)/1" | bc
1234
Run Code Online (Sandbox Code Playgroud)

如果您的版本bc无法处理此问题,请sed改为使用管道:

p=12.34; echo "($p*100)" | bc | sed 's!\.0*$!!'
1234
Run Code Online (Sandbox Code Playgroud)

此 RE 只会从整数中去除尾随零。所以 3.00 会减少到 3,但 3.10 不会减少到 3.1。如果您真的需要从十进制数中去除尾随零的全部能力,则需要 PCRE:

p=12.34; echo "($p*100)" | bc | perl -pe '/\./ && s/0+$/$1/ && s/\.$//'
Run Code Online (Sandbox Code Playgroud)

但是,如果您要使用,perl那么您不妨一开始就省去bc

p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p"
Run Code Online (Sandbox Code Playgroud)

  • 也许使用 `printf` 会比通过 sed 管道更干净?例如`printf '%.0f\n' $(bc &lt;&lt;&lt; "$p*100")` (2认同)

小智 5

您可以使用 awk 来计算值

bash-3.2$ p=0.01
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
1


bash-3.2$ p=0.02
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2


bash-3.2$ p=0.022
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2.2
Run Code Online (Sandbox Code Playgroud)