舍入浮点数bash

问题描述 投票:17回答:4

[确定,所以我试图对17.92857的输入进行四舍五入,以使其在bash中获得17.929的输入。

到目前为止,我的代码是:

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

但是,当我使用它时,它没有四舍五入,它返回17.928

有人知道对此有任何解决方案吗?

bash shell floating-point decimal rounding
4个回答
25
投票

[如果input包含数字,则不需要bc这样的外部命令。您可以只使用printf

printf "%.3f\n" "$input"

Edit:如果输入为公式,则应像以下命令之一一样使用bc

printf "%.3f\n" $(bc -l <<< "$input")
printf "%.3f\n" $(echo "$input" | bc -l)

2
投票

为了扩展蒂姆的答案,您可以为此编写一个shell帮助器函数round ${FLOAT} ${PRECISION}

#!/usr/bin/env bash

round() {
  printf "%.${2}f" "${1}"
}

PI=3.14159

round ${PI} 0
echo
round ${PI} 1
echo
round ${PI} 2
echo
round ${PI} 3
echo
round ${PI} 4
echo
round ${PI} 5
echo
round ${PI} 6
echo

# Outputs:
3
3.1
3.14
3.142
3.1416
3.14159
3.141590

# To store in a variable:
ROUND_PI=$(round ${PI} 3)
echo ${ROUND_PI}

# Outputs:
3.142

1
投票

一个小技巧是将0.0005添加到您的输入中,这样您就可以正确地将数字四舍五入。


-3
投票

如果您收到的舍入错误为数字17.928,请尝试以下操作:读yv =echo "scale = 3; $y" |bc -l如果[$ v == 17.928];然后回声“ 17.929”其他回声$ vfi

© www.soinside.com 2019 - 2024. All rights reserved.