bc
앞에 0을 붙여 소수 분수를 시작하려면 어떻게 해야 합니까 ?
$ bc <<< 'scale=4; 1/3'
.3333
나는 0.3333을 원한다.
답변1
bc
기본적으로 0 추가를 지원하지 않습니다.
해결 방법은 다음과 같습니다.
echo 'scale=4; 1/3' | bc -l | awk '{printf "%.4f\n", $0}'
0.3333
\n
– 개행 문자로 출력을 종료합니다.%f
– 부동 소수점%.4f
– 표시할 자릿수입니다. 소수점 이하 4자리를 지정합니다.
답변2
불행하게도 bc
당신이 할 수 없는 방식으로 쓰여졌습니다. 이 설명은 이웃에도 적용됩니다 dc
. 해결책으로 사람들은 일반적으로 일부 텍스트 처리 도구를 사용하여 출력을 변경하거나 구문이 다른 완전히 다른 도구를 사용하도록 제안 하지만 bc
나 에게는 이러한 간단한 작업에는 너무 무거워 보입니다.perl
python
다른 질문에 따르면 귀하는 사용자인 것으로 보이 므로 다음과 같은 기본 작업에 대해 매우 유사한 구문을 사용하는 zsh
것을 제안합니다 .zcalc
bc
$ zcalc -e '1/3'
0.333333
먼저 이 함수(예: inside )를 로드해야 하며 옵션 .zshrc
을 사용하여 항상 모든 숫자를 부동 소수점으로 처리하고 싶을 수도 있습니다 -f
.
autoload -U zcalc
alias zcalc='zcalc -f'
보너스로 매개변수를 사용하여 계산기에 대한 특수 프롬프트를 정의할 수 있습니다 . ZCALCPROMPT
자세한 내용은 을 참조하세요 man zshcontrib
.
답변3
bc
앞에 0을 사용하도록 설득될 수 있습니다.
for div in 10 1000; do
echo "scale=3;v=158/$div; if(v > -1 && v < 1) print 0,v,\"\n\" else print v, \"\n\"" | bc
done
답변4
이것은 이전 답변을 사용하여 실패를 해결하는 벨트 및 브레이스 솔루션입니다. 이 작은 기능은 선행 0과 음수 기호를 언제, 어디에 붙일지 지능적으로 파악하고 backspace
제어 코드를 사용하여 인쇄된 값에서 뒤로 이동합니다. Posix 모드에서는 작동하지 않습니다 -s|--standard
(또는 Teletype으로 인쇄된 경우!):
#!/usr/bin/env bc
# this is lz.bc
define lz(d) {
if (ibase != 10 || obase != 10) {
print "(io)base must be decimal (10)\n"
return -1
}
n=0; b=0; a=0
if (d<0) n=1 # negative
if (d>-1 && d<0) b=1 # below
if (d>0 && d<1) a=1 # above
print " ", d
for (i=length(d)+1; i>=0; i--) {
print "\b"
if(i==0 && (b || a)) print "0\b\b"
}
if(n) print "-"
print "\n"
return 0
}
v[0]=-.234
v[1]=.234
v[2]=-2.345
v[3]=2.345
v[4]=-123.4567
v[5]=123.456
for(x=0;x<6;x++) {
print v[x], " ... "
r=lz(v[x])
}
obase=16
r=lz(v[5])
quit
호출되면 다음이 표시됩니다.
$ bc lz.bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
-.234 ... -0.234
.234 ... 0.234
-2.345 ... -2.345
2.345 ... 2.345
-123.4567 ... -123.4567
123.456 ... 123.456
(io)base must be decimal (10)