쉘 스크립트를 통해 십진수 값을 다음 정수 값으로 증가시키고 싶습니다.
예를 들어:
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**
어쨌든 십진수 값이 0.00000001보다 크면 값을 2로 인쇄해야 합니다.
답변1
귀하의 질문은 약간 모호합니다. 소수 부분에 관계없이 다음 정수를 원할 경우 대답은 다음과 같습니다 sh
.
echo $((${i%.*} + 1))
다음 정수를 원할 경우(소수 부분이 0보다 큰 경우) 대답은 다음과 같습니다 sh
.
[ -n "${i##*.*[1-9]*}" ]
echo $(( ${i%.*} + $? ))
i
(첫 번째 테스트는 소수점 뒤에 0이 아닌 숫자가 있으면 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