bc를 10.00 대신 10으로 표시하는 방법

bc를 10.00 대신 10으로 표시하는 방법
#!/bin/bash 
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt

이는 대본의 일부일 뿐이지만, 제 의도를 설명하기에는 충분하다고 생각합니다. p는 소수점 이하 두 자리만 있는 변수이므로 q정수여야 하는데... 예를 들어 대신 bc표시됩니다 .10.0010

이 문제를 어떻게 해결할 수 있나요?

답변1

scale=0규모가 결정되는 방식 때문에 명백한 내용으로는 이를 수행할 수 없습니다.

문서에서는 1로 나누는 것만으로도 출력을 match 로 재설정하기에 충분하며 scale기본값은 0이라고 간접적으로 설명합니다.

식1/식2표현식의 결과는 두 표현식의 몫입니다. 결과의 척도는 변수 척도의 값입니다.

p=12.34; echo "($p*100)" | bc
1234.00

p=12.34; echo "($p*100)/1" | bc
1234

bc귀하의 버전이 이를 처리할 수 없는 경우 sed대신 파이프하십시오.

p=12.34; echo "($p*100)" | bc | sed -E -e 's!(\.[0-9]*[1-9])0*$!\1!' -e 's!(\.0*)$!!'
1234

이 RE 쌍은 숫자의 소수 부분에서 후행 0을 제거합니다. 따라서 3.00은 3으로 줄어들고, 3.10은 3.1로 줄어들지만 300은 그대로 유지됩니다.

또는 먼저 사용 perl하고 폐기합니다.bc

p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p"

답변2

awk를 사용하여 값을 계산할 수 있습니다.

bash-3.2$ p=0.01
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
1


bash-3.2$ p=0.02
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2


bash-3.2$ p=0.022
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2.2

답변3

긴 이야기 짧게

당신에게는 많은 선택이 있습니다.기원전알려진 동작이 scale=0항상 예상한 것과는 다르지만 해결 방법은 많습니다. 다음은 몇 가지입니다.

인쇄 기능

사용인쇄 기능출력을 정수로 제한합니다.

$ printf "%g\n" $(echo '12.34 * 100' | bc)
1234

BC와 나눗셈

지속하고 싶다면기원전크기를 조정하려면 크기를 0으로 지정해야 합니다.그리고눈금을 재설정하려면 1로 나눕니다. 이는 알려진 동작이지만 실제로 이유를 설명할 수는 없습니다.

$ echo '12.34 * 100 / 1' | scale=0 bc
1234

sed

불필요한 후행 문자를 제거하십시오.

$ echo '12.34 * 100' | bc | sed 's/\.00$//'
1234

세게 때리다

소수점 앞의 값을 반환하려면 중괄호 확장을 사용하세요.

$ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00}
1234

답변4

이것은 후행 0을 제거하는 bash 함수입니다.

remove_trailing_zeroes()
{
    declare -n n="$1"
    # Prepend a 0 if number starts with a dot.
    if [[ $n =~ ^[.] ]]; then
        n="0$n"
    fi
    # Remove trailing zeroes
    while [[ $n =~ [.].*0$ ]]; do
        n="${n%0}"
    done
    # Remove trailing dot if any
    if [[ $n =~ [.]$ ]]; then
        n="${n%.}"
    fi
}

그런 다음 다음과 같이 귀하의 경우에 사용할 수 있습니다.

q=$(bc <<< "scale=2;$p*100")
remove_trailing_zeroes q
head -n$q numbers.txt > secondcoordinate.txt

관련 정보