Bash에서 십진수 출력을 줄이는 방법은 무엇입니까?

Bash에서 십진수 출력을 줄이는 방법은 무엇입니까?

지금 저는 고급 배관과 관련된 과제를 수행하고 있는데, 문제 중 하나는 백분율을 계산하여 소수점 세 자리까지 줄이는 것과 관련이 있습니다. 백분율을 성공적으로 계산했습니다.

echo "$ERRORS" / "$TOTAL" \* 100 | bc -l

이는 올바른 출력을 제공합니다: 2.64905226881102814400

ERRORS 및 TOTAL은 정수를 포함하는 환경 변수입니다.

하지만 전체 숫자 대신 2.649만 출력하도록 이 명령을 수정하는 방법을 잘 모르겠습니다. bc에서 "scale"을 사용하여 특정 소수 자릿수로 줄이는 방법이 있다는 것을 알고 있지만 echo scale=3; "$ERRORS" / "$TOTAL" \* 100 | bc -l성공하지 못했습니다.

내가 뭘 잘못했나요?

답변1

노력하다:

$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649

대신에. 이 경우 스케일 변수를 설정 scale = 3하기 위해 어떻게 입력되는지 확인하십시오.bc~의bc, 이는 숫자의 자릿수입니다.그것나눗셈의 밑수와 100을 곱하는 방법앞으로부서.

이것은 반올림이 아니라 잘림입니다. 예를 들어 8 * 100 / 9는 88.889가 아니라 88.888이 됩니다.

쉘이 부동 소수점 연산(ksh93, zsh, yash)을 지원하는 경우 다음을 수행할 수도 있습니다.

$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649

(그러나 zsh 및 ksh93에서는 이러한 변수의 내용을 제어하는 ​​것이 중요합니다. 그렇지 않으면 명령 주입 취약점이 발생합니다. ksh93에서와 같이 정수 대신 1e2부동 소수점 100을 사용합니다. 이는 a에서 작동하지 않습니다. 10진수 로 사용되는 로케일).100100.100.,

또는 다음을 사용할 수 있습니다 awk.

$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649

9개 중 8개는 둘 다 88.889%(또는 지역에 따라 88,889개일 수 있음)를 제공합니다.

관련 정보