如何以前bc
导零开始小数?
$ bc <<< 'scale=4; 1/3'
.3333
我想要 0.3333。
答案1
bc
本身不支持加零。
解决方法是:
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
可以说服使用前导零:
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)