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お勧めします。zcalcbc

$ zcalc -e '1/3'
0.333333

まず、この関数をロードする必要があります (たとえば、 内.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)

関連情報