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**

어쨌든 십진수 값이 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

관련 정보