10進値を次の整数値に増やします。

10進値を次の整数値に増やします。

シェルスクリプトを使用して、10進値を次の整数値に増やしたいと思います。

たとえば、

i=**1.6**     then I need to print i=**2**
i=**1.00001** then I need to print i=**2**
i=**1.00049** then also I need to print the value as i=**2**

いずれにしても、10進値が0.00000001より大きい場合は、値を2として印刷する必要があります。

答え1

あなたの質問は少しあいまいです。小数部に関係なく次の整数が必要な場合、答えは次のようになりますsh

echo $((${i%.*} + 1))

次の整数が必要な場合(小数部が0より大きい場合)、答えは次のようになりますsh

[ -n "${i##*.*[1-9]*}" ]
echo $(( ${i%.*} + $? ))

i(最初のテストは、小数点の後にゼロ以外の数字がある場合は1で終了し、そうでない場合は0で終了します。$?終了値を含みます。)

IMHO 同じアイデアがbash読みやすくなります。

[[ "$i" != *.*[1-9]* ]]
echo $(( ${i%.*} + $? ))

POSIXを使用しているため、exprすべてのシェルと互換性があります。

expr "${i%.*}" + \( "${i##*.*[1-9]*}" = "" \)

答え2

渡して結果に追加すると、自動的awkに最も近い数値に丸められます。0.5.f

awk -F\= 'BEGIN{printf("%.f\n", $2+0.5)}' 

答え3

if [[ '1' -eq "$(echo "$i > ${i%.*}" | bc)" ]]; then
    i=$((${i%.*}+1))
else
    i=${i%.*}
fi

答え4

バッシュを想定します。

小数点以下の桁数を処理するには、任意の精度を可能にするプログラムが必要ですbc。たとえば、次のようになります。

$ round(){ bc <<< "a=$1"'; scale=0; b=a/1; if (a==b) a else b+1'; }
$ for i do round "$i"; done
1.0000
2
2
2

またはテキストとして:

$ round(){ reg='^([0-9]*)\.0*[1-9]'; [[ $1 =~ $reg ]] && echo "$((${1%%.*}+1))" || echo "$1"; }
$ set 1.0000 1.6 1.00001 1.00049
$ for i do round "$i"; done
1.0000
2
2
2

関連情報