web-dev-qa-db-ja.com

浮動小数点数の切り上げbash

では、17.92857の入力を切り上げて、bashで17.929の入力を取得できるようにします。

これまでの私のコードは:

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

ただし、これを使用すると切り上げられず、17.928が返されます。

誰かがこれに対する解決策を知っていますか?

18
Quill

inputに数値が含まれている場合、bcのような外部コマンドは必要ありません。 printfを使用するだけです。

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

編集:ただし、入力が数式の場合は、次のいずれかのコマンドのようにbcを使用する必要があります。

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

Timの答えを拡張するには、シェルヘルパー関数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
2
Zane Hooper

少しトリックは、入力に0.0005を追加することです。これにより、数値が正しく切り上げられます。

1
Ludovic Feltz