舍入浮点数bash

时间:2014-10-20 12:15:22

标签: bash shell floating-point decimal rounding

好的,所以我尝试对17.92857的输入进行舍入,以便在bash中输入17.929

到目前为止我的代码是:

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

但是,当我使用它时,它不会向上舍入,而是返回17.928

有没有人知道这方面的任何解决方案?

5 个答案:

答案 0 :(得分:21)

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

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

编辑:如果输入是公式,则应使用bc,如以下命令之一:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以为此编写一个shell辅助函数WS1704003404 59203313 123456724

round ${FLOAT} ${PRECISION}

答案 3 :(得分:-1)

即使Tim在2014年已经回答过,我也想分享Zane函数的改进版本

#!/usr/bin/env bash

# round a float number to the given decimal digits
# if $2 is not given or not a positive integer its set to zero

# float must be in international format, this is more save for scripts
# to use other format replace LC_ALL=C with your language.

_round_float() {
     local digit="${2}"; [[ "${2}" =~ ^[0-9]+$ ]] || digit="0"
     LC_ALL=C printf "%.${digit}f" "${1}"
}

如何使用该功能的一些示例:

# round pi constant
PI=3.141599236

_round_float $PI 0   3
_round_float $PI 1   3.1
_round_float $PI 3   3.142
_round_float $PI 9   3.141599236
_round_float $PI -3  3
_round_float $PI abc 3

您还可以即时调整逗号位置(也就是乘以10)。

 #!/bin/bash
 # change metric base unit
 UNIT=1234.567890

 # comma 1 position right, multiply by 10
 _round_float ${UNIT}e1 3     12345.678

 # comma 3 positions left, eg convert milli seconds to seconds
 _round_float ${UNIT}e-3 3     1.234

 # comma 3 positions right, eg convert m3 to liters
 _round_float ${UNIT}e3 0     1234567

答案 4 :(得分:-2)

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