シェルスクリプトを使用して、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