2014-12-07 5 views
6

나는 사용자로부터 산술 표현식을 읽고 마지막에 소수점 세자리를 반올림하여 출력 화면에 표시하는이 bash 스크립트를 해결하려고합니다.bc 산술 오류

샘플 입력

5+50*3/20 + (19*2)/7 

샘플 출력

17.929 

,174,515의 입력이있을 때 내 코드

read x 
echo "scale = 3; $x" | bc -l 
이다

5+50*3/20 + (19*2)/7 

는 ** 내 출력은 기계가

17.929 

하고이 때문에 내가 솔루션이 잘못되고 싶어하는

17.928 

**입니다. 어떤 생각?

+0

귀하 질문이 아주 모호합니다. "샘플 출력"이란 무엇입니까? "내 결과"란 무엇입니까? "기계는 그것이되기를 원한다"라고하는 것은 무엇입니까? 사실, 스크립트가 생성하기를 원하는 출력은 무엇입니까? 잘라 버리거나 둥글니까? –

+0

샘플 입력은 내 스크립트가 맞는지 아닌지를 확인하기 위해 기계가 생성하는 입력입니다.이 출력에 대해 출력은 샘플 출력입니다. 내 출력은 내 스크립트가 생성하는 출력입니다. 출력이 샘플 출력과 비슷해야합니다. @ YvesDaoust – krrish

+0

어쩌면 설명을 덜 모호하게 만들지 않았다고 잘못 말할 수 있는지 모르겠습니다. 잘린 또는 둥근? –

답변

3

열쇠는 여기의 printf를 사용해야하는 것입니다 "% .3f"의 포맷 스펙을 가지고 printf는 bc에 대해 "scale = 4"만큼 원한다면 반올림을 처리 할 것입니다. 당신이 명령 줄에서이 명령을 실행하면

echo -e "please enter math to calculate: \c" 
read x 
printf "%.3f\n" $(echo "scale=4;$x" | bc -l) 

당신은 위의 용액에 무슨 일이 일어나고 있는지에 대한 이해를 얻을 수 있습니다 :

여기에 작동하는 스크립트의 echo "scale=4;5+50*3/20 + (19*2)/7" | bc 결과가 17.9285 될 것입니다. 결과가 인수로 printf에 제공되면 함수는 소수점 네 자릿수를 고려하여 값을 반올림하여 형식화 된 결과가 정확히 소수점 세 자리와 17.929의 값으로 표시되도록합니다. 나는 전적으로 당신이 반올림되지 않은 jherran에 동의

echo -e "please enter math to calculate: \c" 
read x 
printf "%.3f\n" $(bc -l <<< "scale=4;$x") 
+0

'printf "% .3f"$ (printf "scale = 4; 5 + 50 * 3/20 + (19 * 2)/7 \ n"| bc)'일 수 있습니다. ':)' –

+0

양쪽 모두에서 printf의 포맷 기능이 필요하지 않습니다. 의도적으로 에코 b/c를 사용하여 특정 부분의 형식을 지정할 필요가 없습니다. 반면 반올림 printf "% .3f"는 의미가 있습니다. 당신은 받아 들여진 대답을 stackoverflow.com/questions/2395284/에서 볼 수 있습니다. - – slevy1

+0

제발 둘 다 잘못되었다고 말하고 있다고 생각하지 마십시오. 그러나 숙고하는 동안 상대방의 혼란에 대해 생각해야합니다 ("왜 여기에'printf '를 사용하고'echof'를 두 곳 모두에 사용하지 않았습니까?)) 위의 설명은 완벽합니다. –

3

숫자를 반올림하지 않고 자릅니다.

$ echo "5+50*3/20 + (19*2)/7" | bc -l 
17.92857142857142857142 
$ echo "scale = 3; 5+50*3/20 + (19*2)/7" | bc -l 
17.928 

내가 숫자를 반올림 알고있는 유일한 방법은 awk을 사용하고 있습니다 :

$ awk 'BEGIN { rounded = sprintf("%.3f", 5+50*3/20 + (19*2)/7); print rounded }' 
17.929 

을 그래서, 당신에게 예 :

read x 
awk 'BEGIN { rounded = sprintf("%.3f", $x; print rounded }' 
1

: 서브 쉘을 생성 피할 수있는 다음과 같은

또한,이 역시 기원전에 대한 입력으로 여기 문서를 리디렉션하여 파이프없이 작동 번호, 당신은 그것을 자르고 있습니다. 나는 규모가 아마도 당신이 원하는 모든 방식으로 행동하지 않을 것이라고 말할 것입니다. 아마도 아무도 행동하지 않기를 원할 것입니다.

> x="5+50*3/20 + (19*2)/7" 
> echo "$x" | bc -l 
17.92857142857142857142 
> echo "scale = 3; $x" | bc -l 
17.928 

또한 because of the behaviour of scale, 당신은 추가 별도로 각 곱셈/나눗셈 반올림된다.몇 가지 예를 들어 설명해 드리겠습니다 :

> echo "scale=0; 5/2" | bc -l 
2 
> echo "scale=0; 5/2 + 7/2" | bc -l 
5 
> echo "5/2 + 7/2" | bc -l 
6.00000000000000000000 

아무런 스케일도 작동하지 않습니다. 추악한 해결 방법이 있습니다.

> echo "scale=0; 5.5" | bc -l 
5.5 
> echo "scale=0; 5.5/1" | bc -l 
5 

이렇게 토우 물건이 나옵니다.

  • bc의 눈금을 사용하려면 이미 계산 된 최종 결과에 대해서만 수행하십시오. 그러면 조심하십시오.

  • 반올림은 원하는 정밀도의 반을 잘라내는 것과 같습니다.

는 반올림해야 숫자에 0.5를 추가하면 우리가 가장 가까운 정수로 반올림의 예를 들어 보자, 그 정수 부분은 다음 정수 값을하고 절단하여 원하는 결과를 줄 것이다. 해당 숫자가 반올림 된 것이면 .5를 추가해도 정수 값이 변경되지 않으며 잘라내 기가 추가되지 않은 경우와 동일한 결과를 가져옵니다.

따라서 내 솔루션은 다음과 같습니다

다시
> y=$(echo "$x" | bc -l) 
> echo "scale=3; ($y+0.0005)/1" | bc -l # scale doesn't apply to the +, so we get the expected result 
17.929 

, 정말 필요하므로이 작업에 그것을 파괴, (위에서 설명) 다음이 작동하지 않습니다 :

> echo "scale=3; ($x+0.0005)/1" | bc -l 
17.928 
+0

사실 그것은 작동하지 않습니다. 아래에 답변을 표시 했으므로 작동했습니다. 어쨌든 나는 시간을내어 설명하는 데 너무나 위대하다. 나는 기본 개념을 이해했다. @ Climbali – krrish