2026年5月29日

2026年5月29日

Linux の bc コマンドで計算する方法|小数(scale)・-l・進数変換・シェルでの使い方

bc は、桁数の制限なく計算できるコマンドラインの計算機です。Bash の $(( )) は整数しか扱えませんが、bc なら小数の計算や大きな数の計算ができるので、シェルスクリプトで使用率や金額を計算するときに使われます。

この記事の実行結果は、Debian 12 の GNU bc 1.07.1 で確かめたものです(2026年11月時点)。

インストール

多くのディストリビューションに入っていますが、最小構成のサーバーやコンテナには入っていないことがあります。bc: command not found と出たら入れます。

# Debian / Ubuntu
sudo apt install bc

# AlmaLinux / Rocky Linux / Fedora
sudo dnf install bc

基本の使い方

式を標準入力から渡します。echo とパイプで渡すのが一般的で、Bash ならヒアストリング(<<<)でも書けます。

echo "2 + 3" | bc      # 5
echo "-1 - 2" | bc     # -3
echo "4 * 5" | bc      # 20
echo "10 / 3" | bc     # 3(小数点以下は切り捨て)
echo "10 % 3" | bc     # 1(余り)
echo "2 ^ 10" | bc     # 1024(べき乗。指数は整数のみ)
bc <<< "3 * 4"         # 12

引数なしで bc を実行すると対話モードになり、1 行ずつ計算できます。終わるときは quit と入力するか、Ctrl+D を押します。

小数を扱う: scale

bc の割り算は、何も指定しないと小数点以下 0 桁になります。小数点以下の桁数は scale で指定します。

echo "scale=2; 10 / 3" | bc    # 3.33
echo "scale=2; 20 / 3" | bc    # 6.66(6.67 にはならない)
echo "scale=2; 2 / 3" | bc     # .66(先頭の 0 が付かない)
echo "scale=4; 1.5 * 2" | bc   # 3.0

注意する点が 3 つあります。

  • 四捨五入ではなく切り捨てです。20 / 3 は 6.66 になります。
  • 1 未満の数は先頭の 0 が付きません(.66)。ほかのプログラムに渡すときに困る場合は、後述の printf で整えます。
  • 掛け算の結果の桁数は scale どおりにならないことがあります。掛け算は、元の数の小数点以下の桁数をもとに結果の桁数が決まるため、scale=4; 1.5 * 2 は 3.0 になります。scale の桁数がそのまま結果に表れるのは割り算です。

-l オプション: 数学ライブラリ

bc -l で起動すると、scale が 20 になり、数学関数が使えるようになります。

echo "10 / 3" | bc -l          # 3.33333333333333333333
echo "sqrt(2)" | bc -l         # 1.41421356237309504880(sqrt は -l なしでも使える)
echo "4 * a(1)" | bc -l        # 円周率(a は逆正接)
関数 意味
s(x) 正弦(x はラジアン)
c(x) 余弦(x はラジアン)
a(x) 逆正接(結果はラジアン)
l(x) 自然対数
e(x) 指数関数(e の x 乗)
sqrt(x) 平方根

^ の指数は整数しか使えないので、2 ^ 0.5 のような計算は e(0.5 * l(2)) と書きます。

進数の変換: ibase と obase

obase は出力の進数、ibase は入力の進数です。

echo "obase=2; 10" | bc      # 1010(10 進数 → 2 進数)
echo "obase=16; 255" | bc    # FF(10 進数 → 16 進数)
echo "ibase=16; FF" | bc     # 255(16 進数 → 10 進数。A〜F は大文字で書く)

両方を指定するときは、obase を先に書きます。ibase を先に変えると、その後の obase の値も新しい進数で読まれるためです。

echo "ibase=2; obase=10; 1010" | bc   # 1010(obase の 10 が 2 進数の 10、つまり 2 と読まれる)
echo "obase=10; ibase=2; 1010" | bc   # 10(意図どおり)

変数と関数

bc の中で変数に値を入れて使えます。シェルの変数を渡すときは、シェル側で展開してから bc に渡します。

echo "scale=2; x = 7 / 2; x * 2" | bc   # 7.00

a=10
b=20
echo "$a + $b" | bc                     # 30

define で関数を定義できます。よく使う関数はファイルに書いておき、bc の引数にファイル名を渡すと、ファイルを読み込んだ後に標準入力の式を計算します。

echo 'define triple(x) { return (x * 3); }' > ~/triple.bc
echo "triple(5)" | bc ~/triple.bc        # 15

四捨五入したい場合は、関数にしておくと便利です。

define round(x, n) {
    auto s, r
    s = scale
    scale = n + 1
    if (x >= 0) r = x + 5 / 10 ^ (n + 1) else r = x - 5 / 10 ^ (n + 1)
    scale = n
    r = r / 1
    scale = s
    return (r)
}

これを ~/round.bc に保存して使います。

echo "round(10 / 3, 2)" | bc -l ~/round.bc   # 3.33
echo "round(2 / 3, 2)" | bc -l ~/round.bc    # .67
echo "round(2.5, 0)" | bc -l ~/round.bc      # 3

表示の桁をそろえるだけなら、シェルの printf でも四捨五入できます(ロケールによっては小数点がカンマになるので、必要なら LC_NUMERIC=C を付けます)。

printf '%.2f\n' "$(echo 'scale=4; 10 / 3' | bc)"   # 3.33
LC_NUMERIC=C printf '%.2f\n' "$(echo 'scale=4; 2 / 3' | bc)"   # 0.67

シェルスクリプトで使う

結果を変数に入れる

result=$(echo "scale=2; 1980 * 1.1" | bc)
echo "$result"    # 2178.0

小数を比較する

Bash の [ ] や (( )) は小数を比較できません。bc の比較演算子は、成り立てば 1、成り立たなければ 0 を出すので、それを使います。

usage=87.5
if (( $(echo "$usage >= 80" | bc) )); then
    echo "使用率が 80% 以上です"
fi

列の合計を出す

printf '1.5\n2.25\n3\n' | paste -sd+ - | bc    # 6.75

エラーを検出する

bc は、0 で割ったときや式の書き間違いがあっても、終了ステータスが 0 のままです。エラーの内容は標準エラー出力に出るので、そちらを見て判断します。if ! output=$(... | bc) のように終了ステータスで判定しても、エラーは検出できません。

calc() {
    local errfile result
    errfile=$(mktemp)
    result=$(echo "$1" | bc -l 2>"$errfile")
    if [ -s "$errfile" ] || [ -z "$result" ]; then
        echo "計算エラー: $1 ($(cat "$errfile"))" >&2
        rm -f "$errfile"
        return 1
    fi
    rm -f "$errfile"
    echo "$result"
}

calc "10 / 4"                       # 2.50000000000000000000
calc "1 / 0" || echo "失敗を検知"     # 計算エラー: 1 / 0 (Runtime error ...: Divide by zero)

長い数の折り返しを止める

GNU bc は、70 文字を超える結果を \ と改行で折り返します。ほかのコマンドに渡すときは、環境変数 BC_LINE_LENGTH=0 で折り返しを止めます。

echo "2 ^ 300" | BC_LINE_LENGTH=0 bc

まとめ

  • 式は echo "式" | bc で渡す。何も指定しないと割り算は整数(切り捨て)
  • 小数は scale で桁数を指定する。四捨五入ではなく切り捨てで、1 未満は先頭の 0 が付かない
  • bc -l で scale が 20 になり、s c a l e の数学関数が使える
  • 進数変換は obase を先に、ibase を後に書く
  • スクリプトでは比較結果の 1 / 0 を使い、エラーは終了ステータスではなく標準エラー出力で判定する

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲