72

Makefileで次のようなことをします。

echo "0.1 + 0.1" | bc

(もちろん、実際のファイルでは数値は動的です)

印刷.2しますが、印刷したいです0.2

頼らずにやりたいのですが、ゼロを印刷するsed方法がわからないようです。bcそれともbc、これを行うことができないのですか?

4

12 に答える 12

46

awk を使用してフォーマットすることもできます。

 echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'

または awk 自体が計算を行う:

 echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'
于 2011-12-06T15:38:33.760 に答える
38

これはあなたのために働くかもしれません:

echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc
于 2011-12-06T17:50:47.067 に答える
30

ソース(のbc_out_num()1461 行を参照) をざっと見てみると0、整数部分が0. 何か見落としがない限り、この動作はコマンドライン フラグを使用して変更できるパラメータに依存しません。

簡単な答え:いいえ、bc印刷番号を思い通りにする方法はないと思います。

sedそれでも使用したい場合は、使用しても問題はないと思いますbc。以下は、私見ですが、それほど恐ろしいものではありません。

[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2

本当に回避したい場合は、 eljuniorchoroba のsed両方の提案は非常に優れていますが、末尾のゼロを回避するために値に応じた調整が必要です。それはあなたにとって問題になるかもしれませんし、そうでないかもしれません。

于 2011-12-06T16:19:11.990 に答える
12

ドキュメントで出力形式について何も見つかりません。sed の代わりに、printf を使用することもできます。

printf '%3.1f\n' $(bc<<<0.1+0.1)
于 2011-12-06T15:23:52.043 に答える
4

echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'

これは、結果が次のようなすべてのケースで機能するはずです。

  • 「-.123」
  • 「.123」
  • 「-1.23」
  • 「1.23」

説明:

  1. で始まるものはすべて-.、に置き換え-.ます-0.

  2. で始まるものはすべて.、に置き換え.ます0.

于 2017-11-03T04:39:54.513 に答える
2

おそらく、bc現代にとって最高の「ベンチ電卓」とは言えません。他の言語では、より詳細に制御できます。以下は、先頭にゼロを付けて範囲 (-1.0..+1.0) の値を出力する実際の例です。これらの例では、 Here String構文とともにbcAWK、および を使用しています。Python 3

#!/bin/bash

echo "using bc"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ")
   }
echo

echo "using awk"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(echo|awk "{printf \"%.1f\",$i/2}")
   }  
echo

echo "using Python"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(python3<<<"print($i/2)")
   }

それが重要な場合、Python バージョンは約 10 倍遅いことに注意してください (それでもほとんどの目的で非常に高速です)。


shorで自明でない計算を行うbcのはばかげた用事です。今日では、はるかに優れたベンチ電卓が利用可能です。たとえば、Here Documentsを使用して、Bash スクリプト内に Python サブルーチンを埋め込んで実行できます。

function mathformatdemo {
python3<<SCRIPT
import sys
from math import *
x=${1} ## capture the parameter from the shell
if -1<=x<=+1:
    #print("debug: "+str(x),file=sys.stderr)
    y=2*asin(x)
    print("2*asin({:2.0f})={:+6.2f}".format(x,y))
else: print("domain err")
SCRIPT
}

echo "using Python via Here-doc"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(mathformatdemo $i)
   }

出力:

using Python via Here-doc
domain err
2*asin(-1)= -3.14
2*asin( 0)= +0.00
2*asin( 1)= +3.14
domain err
于 2015-04-20T22:05:20.083 に答える
1

これはbcのみを使用し、負の数で機能します:

bc <<< "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";

試してみてください:

for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do
  bc <<< "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
  echo;
done
于 2013-06-09T06:25:45.770 に答える