如何讓 bc 以前導零開始小數

如何讓 bc 以前導零開始小數

如何以前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輸出,或使用完全不同的工具,例如具有不同語法的perlpython,但對我來說,它們對於這樣簡單的任務來說似乎太重了。

從您的其他問題來看,您似乎是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)

相關內容