Bash는 부동 소수점 변수의 정밀도를 제한합니다.

Bash는 부동 소수점 변수의 정밀도를 제한합니다.

Ubuntu bash에서는 소수점 이하 자릿수를 0 14.04.1 LTS 64-bit으로 설정하고 소수점 왼쪽의 0을 제거할 수 없습니다. 으로 bc어떻게 전환할 수 있나요 ? 이것은 내 파일 명명 규칙 때문에 필요합니다. 제안해 주셔서 감사합니다.0.005000000.005

업데이트: 이미 정의된 쉘 변수와 함께 이것을 사용하고 다시 정의할 수 있습니까? 아래 코드에서는 오류가 발생합니다.

~/Desktop/MEEP$ printf "%.3f\n" $w
bash: printf: 0.005000: invalid number
0,000

로케일 출력

@vesnog:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=tr_TR.UTF-8
LC_TIME=tr_TR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=tr_TR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=tr_TR.UTF-8
LC_NAME=tr_TR.UTF-8
LC_ADDRESS=tr_TR.UTF-8
LC_TELEPHONE=tr_TR.UTF-8
LC_MEASUREMENT=tr_TR.UTF-8
LC_IDENTIFICATION=tr_TR.UTF-8
LC_ALL=

산출echo $w

@vesnog:~$ echo $w
0.005000

답변1

간단한 방법은 다음을 사용하는 것입니다 printf.

$ printf "%.3f\n" 0.005000000000
0.005

선행을 제거하려면 0다음과 같이 구문 분석하십시오 sed.

$ printf "%.3f\n" 0.005000000000 | sed 's/^0//'
.005

답변2

라는 특수 변수가 있습니다 scale. 이 변수를 설정하여 정밀도를 제한할 수 있습니다.

$ echo "300/7" | bc -l
42.85714285714285714285

정확도를 제한하려면,

$ echo "scale=2; 300/7" | bc -l
42.85

고쳐 쓰다

$ echo "scale=3; 300/7" | bc -l | sed 's/[0-9]*\././g'
.857

답변3

이 sed 명령은 후행 0을 제거합니다.

sed 's/\(0\.0*[1-9][1-9]*\)0*/\1/'

로 시작 하고 그 뒤에 0.0개 이상의 0', 1~9 사이의 1개 이상의 숫자, 0개 이상의 '가 오는 0모든 값을 기억합니다. 그런 다음 0개 이상의 후행 항목을 자릅니다 0.

이를 통해 후행 0을 원하는 만큼 구문 분석하고 0보다 큰 임의의 낮은 숫자를 유지할 수 있습니다. 아무리 작더라도.

예를 들어

0.054000가 되거나 0.0540.00000010000000되거나 0.0000001등이 됩니다.

자세한 내용은 Grymoires Awesome을 확인하세요.sed지도 시간.

답변4

grep을 사용하지 않는 이유는 무엇입니까?

echo "$your_number" | grep -o '.*[1-9]'

관련 정보