10시가 아닌 10시를 표시하도록 BC를 만드는 방법

10시가 아닌 10시를 표시하도록 BC를 만드는 방법
#!/bin/bash 
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt

그것은 대본의 일부일 뿐이지만, 내 의도를 명확히 하기에는 충분하다고 생각합니다. p은 소수점 이하 두 자리만 있는 변수이므로 q정수여야 합니다... 그럼에도 불구하고 는 예 를 들어 대신 bc을 표시합니다 .10.0010

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

답변1

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

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

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

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

TL;DR

당신에게는 많은 옵션이 있습니다.기원전항상 예상 한 대로 작동하지 않는 것으로 알려져 있지만 scale=0해결 방법이 많이 있습니다. 다음은 몇 가지입니다.

printf

사용printf출력을 정수로 제한합니다.

$ 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

관련 정보