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
(또는 텔레타이프 인쇄!) 에서는 작동하지 않습니다 .
#!/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)