Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > bigdecimalライブラリ > BigDecimalクラス

class BigDecimal

クラスの継承リスト: BigDecimal < Object < Kernel < BasicObject

Abstract

特異メソッド

_load(str)
double_fig

Ruby の Float クラスが保持できる有効数字の数を返します。

p BigDecimal::double_fig  # ==> 20 (depends on the CPU etc.)

double_figは以下の C プログラムの結果と同じです。

double v = 1.0;
int double_fig = 0;
while (v + 1.0 > 1.0) {
   ++double_fig;
   v /= 10;
}
limit([n])

生成されるBigDecimalオブジェクトの最大桁数をn桁に制限します。 戻り値は設定する前の値です。設定値のデフォルト値は0で、桁数無制限という意味です。 n を指定しない、または n が nil の場合は、現状の最大桁数が返ります。 計算を続行する間に、数字の桁数が無制限に増えてしまうような場合 limit で 予め桁数を制限できます。この場合 BigDecimal.mode で指定された丸め処理が 実行されます。ただし、インスタンスメソッド (BigDecimal#truncate / BigDecimal#round / BigDecimal#ceil / BigDecimal#floor / BigDecimal#add/ BigDecimal#sub / BigDecimal#mult / BigDecimal#div) の桁数制限は limit より優先されます。

mf = BigDecimal::limit(n)
mode(s [, v])

BigDecimalの実行結果を制御します。 第2引数を省略、または nil を指定すると現状の設定値が戻ります。 以下の使用方法が定義されています。

例外処理

計算結果が非数(NaN)やゼロによる除算になったときの処理を定義することができます。

  f = BigDecimal::mode(BigDecimal::EXCEPTION_NaN,flag)
  f = BigDecimal::mode(BigDecimal::EXCEPTION_INFINITY,flag)
  f = BigDecimal::mode(BigDecimal::EXCEPTION_UNDERFLOW,flag)
  f = BigDecimal::mode(BigDecimal::EXCEPTION_OVERFLOW,flag)
  f = BigDecimal::mode(BigDecimal::EXCEPTION_ZERODIVIDE,flag)
  f = BigDecimal::mode(BigDecimal::EXCEPTION_ALL,flag)


* [[m:BigDecimal::EXCEPTION_NaN]] は結果が NaN になったときの指定です。
* [[m:BigDecimal::EXCEPTION_INFINITY]] は結果が無限大(±Infinity)になったときの指定です。
* [[m:BigDecimal::EXCEPTION_UNDERFLOW]] は指数部がアンダーフローするときの指定です。
* [[m:BigDecimal::EXCEPTION_OVERFLOW]] は指数部がオーバーフローするときの指定です。
* [[m:BigDecimal::EXCEPTION_ZERODIVIDE]] はゼロによる割り算を実行したときの指定です。
* [[m:BigDecimal::EXCEPTION_ALL]] は、可能な全てに対して一括して設定するときに使用します。

flag が true のときは、指定した状態になったときに例外を発行するようになります。 flag が false(デフォルト)なら、例外は発行されません。計算結果は以下のようになります。

BigDecimal::EXCEPTION_INFINITYBigDecimal::EXCEPTION_OVERFLOWBigDecimal::EXCEPTION_ZERODIVIDE は今のところ同じです。 戻り値は、設定後の値です。「値」の意味は、例えば BigDecimal::EXCEPTION_NaN と「値」の & が ゼロ以外ならば BigDecimal::EXCEPTION_NaNが設定されているという意味です。

丸め処理指定

計算途中の丸め操作の指定ができます。

f = BigDecimal::mode(BigDecimal::ROUND_MODE,flag)

の形式で指定します。 ここで、flag は以下(括弧内は対応するインスタンスメソッド)の一つを指定します。

戻り値は指定後の flag の値です。第2引数に nil を指定すると、現状の設定値が返ります。 mode メソッドでは丸め操作の位置をユーザが指定することはできません。丸め操作と位置を自分で制御したい場合は BigDecimal::limit や truncate/round/ceil/floor、 add/sub/mult/div といったインスタンスメソッドを使用して下さい。

new(s [, n])

新しい BigDecimal オブジェクトを生成します。 s は数字を表現する初期値を文字列で指定します。スペースは無視されます。 また、判断できない文字が出現した時点で文字列は終了したものとみなされます。 n は必要な有効桁数(a の最大有効桁数)を整数で指定します。 n が 0 または省略された ときは、n の値は s の有効桁数とみなされます。 s の有効桁数より n が小さいときも n=0 のときと同じです。 a の最大有効桁数は n より若干大い値が採用されます。 最大有効桁数は以下のような割り算を実行するとき等に意味を持ちます。

BigDecimal("1")    / BigDecimal("3")    # => 0.3333333333 33E0
BigDecimal("1",10) / BigDecimal("3",10) # => 0.3333333333 3333333333 33333333E0

ただし、個々の演算における最大有効桁数 n の取り扱いは将来のバージョンで若干変更される可能性があります。

ver

インスタンスメソッド

self % n

詳細は Float#% を参照して下さい。

self * other

乗算 (c = a * b)。

c の精度は (a の精度) + (b の精度) 程度です。 詳しくは「計算精度について」を参照してください。

self ** n

a の n 乗を計算します。n は整数。

c = a ** n

結果として c の有効桁は a の n 倍以上になるので注意。

self + other

加算 (c = a + b)。

c の精度については「計算精度について」を参照してください。

+
self - other

減算 (c = a - b)、または符号反転 (c = -a)。

c の精度については「計算精度について」を参照してください。

-
self / other

除算 (c = a / b)。

c の精度については「計算精度について」を参照してください。

self < other
self <= other
self <=> other

a == b なら 0、a > b なら 1、a < b なら -1 になります。

c = a <=> b
self == other
self === other
self > other
self >= other
_dump
abs

a の絶対値

c = a.abs
add(b, n)

以下のように使用します。

c = a.add(b, n)

c = a + b を最大で n 桁まで計算します。 a + b の精度が n より大きいときは BigDecimal.mode で指定された方法で丸められます。 n がゼロなら + と同じです。

ceil([n])

a 以上の整数のうち、最も小さい整数を計算し、 その値 (BigDecimal 値)を返します。

c = BigDecimal("1.23456").ceil   # => 2
c = BigDecimal("-1.23456").ceil  # => -1

以下のように引数を与えて、小数点以下 n+1 位の数字を操作することもできます。 n >= 0 なら、小数点以下 n + 1 位の数字を操作します (小数点以下を、最大 n 桁にします)。 n が負のときは小数点以上 n 桁目を操作します (小数点位置から左に少なくとも n 個の 0 が並びます)。

c = BigDecimal("1.23456").ceil(4)    # => 1.2346
c = BigDecimal("15.23456").ceil(-1)  # => 20.0
coerce
div(b [, n])

以下のように使用します。

c = a.div(b,n)

c = a / b を最大で n 桁まで計算します。 a / b の精度が n より大きいときは BigDecimal.mode で指定された方法で丸められます。 n がゼロなら BigDecimal#/ と同じです。 n が省略されたときは Float#div と同様に結果が BigDecimal になります。

divmod(n)

詳細は Float#divmod を参照して下さい。

eql?
exponent

指数部を整数値で返します。

n = a.exponent

は a の値が 0.xxxxxxx*10**n を意味します。

finite?

a.finite? は a が∞または NaN でないとき真を返します。

fix

self の小数点以下の切り捨て。

floor([n])

a 以下の最大整数 (BigDecimal 値) を返します。

c = BigDecimal("1.23456").floor      # => 1
c = BigDecimal("-1.23456").floor     # => -2

以下のように引数 n を与えることもできます。 n >= 0 なら、小数点以下 n + 1 位の数字を操作します (小数点以下を、最大 n 桁にします)。 n が負のときは小数点以上 n 桁目を操作します (小数点位置から左に少なくとも n 個の 0 が並びます)。

c = BigDecimal("1.23456").floor(4)   # => 1.2345
c = BigDecimal("15.23456").floor(-1) # => 10.0
frac

self の整数部分の切り捨て。

hash
infinite?

a.infinite? は a が+∞のとき 1 、-∞のときは -1、 それ以外のときは nil を返します。

inspect

デバッグ出力に使用されます。

p a = BigDecimal::new("3.14",10)

とすると、[0x112344:'0.314E1',4(12)] のように出力されます。 最初の16進数はオブジェクトのアドレス、次の '0.314E1' は値、 次の4は現在の有効桁数(表示より若干大きいことがあります)、 最後はオブジェクトが取り得る最大桁数になります。

modulo(n)

詳細は Float#modulo を参照して下さい。

mult(b, n)

以下のように使用します。

c = a.mult(b,n)

c = a * b を最大で n 桁まで計算します。 a * b の精度が n より大きいときは BigDecimal.mode で指定された方法で丸められます。 n がゼロなら * と同じです。

nan?

a.nan? は a が NaN のとき真を返します。

nonzero?

a が 0 なら nil、0 以外なら a そのものが返ります。

c = a.nonzero?
power(n)

メソッド演算子 ** と同じで、a の n 乗を計算します。n は整数。

c = a.power(n)

結果として c の有効桁は a の n 倍以上になるので注意。

precs

a の有効数字 (n) と最大有効数字 (m) の配列を返します。

n, m = a.precs
quo(n)

詳細は Float#quo を参照して下さい。

remainder(n)

詳細は Float#remainder を参照して下さい。

round(n [, b])

クラスメソッド BigDecimal.mode(BigDecimal::ROUND_MODE,flag) で指定した BigDecimal::ROUND_MODE に従って丸め操作を実行します。 BigDecimal.mode(BigDecimal::ROUND_MODE,flag) で何も指定せず、 かつ、引数を指定しない場合は 「小数点以下第一位の数を四捨五入して整数(BigDecimal 値)」にします。

c = BigDecimal("1.23456").round   # => 1
c = BigDecimal("-1.23456").round  # => -1

以下のように引数を与えて、小数点以下 n+1 位の数字を操作することもできます。 n が正の時は、小数点以下 n+1 位の数字を丸めます(小数点以下を、最大 n 桁にします)。 n が負のときは小数点以上 n 桁目を丸めます(小数点位置から左に少なくとも n 個の 0 が並びます)。

c = BigDecimal("1.23456").round(4)    # => 1.2346
c = BigDecimal("15.23456").round(-1)  # => 20.0

2番目の引数を指定すると、BigDecimal#mode の指定を無視して、 指定された方法で丸め操作を実行します。

c = BigDecimal("1.23456").round(3,BigDecimal::ROUND_HALF_EVEN)   # => 1.234
c = BigDecimal("1.23356").round(3,BigDecimal::ROUND_HALF_EVEN)   # => 1.234
sign

値が正 (sign > 0)、負 (sign < 0)、その他 (sign == 0) であるかの情報を返します。

n = a.sign

としたとき n の値は a が以下のときを意味します。 () の中の数字は、実際の値です (「内部構造」を参照)。

n = BigDecimal::SIGN_NaN(0)                 # a は NaN
n = BigDecimal::SIGN_POSITIVE_ZERO(1)       # a は +0
n = BigDecimal::SIGN_NEGATIVE_ZERO(-1)      # a は -0
n = BigDecimal::SIGN_POSITIVE_FINITE(2)     # a は正の値
n = BigDecimal::SIGN_NEGATIVE_FINITE(-2)    # a は負の値
n = BigDecimal::SIGN_POSITIVE_INFINITE(3)   # a は+Infinity
n = BigDecimal::SIGN_NEGATIVE_INFINITE(-3)  # a は-Infinity
split

BigDecimal 値を 0.xxxxxxx*10**n と表現したときに、 符号 (NaNのときは 0、それ以外は+1か-1になります)、 仮数部分の文字列("xxxxxxx")と、基数(10)、更に指数 n を配列で返します。

a = BigDecimal::new("3.14159265")
f, x, y, z = a.split

とすると、f =+ 1、x = "314159265"、y = 10、z = 1 になります。 従って、

s = "0."+x
b = f*(s.to_f)*(y**z)

Float に変換することができます。

sqrt(n)

a の有効桁 n 桁の平方根 (n の平方根ではありません) をニュートン法で計算します。

c = a.sqrt(n)
sub(b, n)

のように使用します。

c = a.sub(b,n)

c = a - b を最大で n 桁まで計算します。 a - b の精度が n より大きいときは BigDecimal.mode で指定された方法で丸められます。 n がゼロなら - と同じです。

to_f

Float オブジェクトに変換します。 よりきめ細かい値が必要ならば BigDecimal#split メソッドを利用してください。

to_i

小数点以下を切り捨てて整数に変換します。

i = a.to_i

i は値に応じて FixnumBignum になります。 a が Infinity や NaN のとき、i は nil になります。

to_int
to_s([n])

文字列に変換します (デフォルトは "0.xxxxxEn" の形になります)。

BigDecimal("1.23456").to_s  #  ==> "0.123456E1"

引数 n に正の整数が指定されたときは、小数点で分けられる左右部分を、 それぞれ n 桁毎に空白で区切ります。

BigDecimal("0.1234567890123456789").to_s(10)   # => "0.1234567890 123456789E0"

引数 n に正の整数を表す文字列を指定することもできます。

BigDecimal("0.1234567890123456789").to_s("10") # => "0.1234567890 123456789E0"

文字列の最初に '+' (または ' ') を付けると、値が正の場合、 先頭に '+' (または ' ')が付きます。負の場合は常に '-' が付きます。

BigDecimal("0.1234567890123456789").to_s(" 10") # => " 0.1234567890 123456789E0"
BigDecimal("0.1234567890123456789").to_s("+10") # => "+0.1234567890 123456789E0"
BigDecimal("-0.1234567890123456789").to_s("10") # => "-0.1234567890 123456789E0"

さらに文字列の最後に E (または e) か F (または f) を指定することで、 以下のように表示形式を変更することができます。

BigDecimal("1234567890.123456789").to_s("E")  # => "0.1234567890123456789E10"
BigDecimal("1234567890.123456789").to_s("F")  # => "1234567890.123456789"
BigDecimal("1234567890.123456789").to_s("5E") # => "0.12345 67890 12345 6789E10"
BigDecimal("1234567890.123456789").to_s("5F") # => "12345 67890.12345 6789"
truncate

小数点以下の数を切り捨てて整数 (BigDecimal 値)にします。 以下のように引数を与えて、小数点以下 n+1 位の数字を操作することもできます。 n が正の時は、小数点以下 n+1 位の数字を切り捨てます (小数点以下を、最大 n 桁にします)。 n が負のときは小数点以上 n 桁目を操作します (小数点位置から左に少なくとも n 個の 0 が並びます)。

c = BigDecimal("1.23456").truncate(4)    # => 1.2345
c = BigDecimal("15.23456").truncate(-1)  # => 10.0
zero?

a が 0 なら true を返します。

c = a.zero?

定数

BASE
EXCEPTION_ALL
EXCEPTION_INFINITY
EXCEPTION_NaN
EXCEPTION_OVERFLOW
EXCEPTION_UNDERFLOW
EXCEPTION_ZERODIVIDE
ROUND_CEILING
ROUND_DOWN
ROUND_FLOOR
ROUND_HALF_DOWN
ROUND_HALF_EVEN
ROUND_HALF_UP
ROUND_MODE
ROUND_UP
SIGN_NEGATIVE_FINITE
SIGN_NEGATIVE_INFINITE
SIGN_NEGATIVE_ZERO
SIGN_NaN
SIGN_POSITIVE_FINITE
SIGN_POSITIVE_INFINITE
SIGN_POSITIVE_ZERO

追加されるメソッド

to_digits [added by bigdecimal/util]

Converts a BigDecimal to a String of the form "nnnnnn.mmm". This method is deprecated; use BigDecimal#to_s("F") instead.

to_r [added by bigdecimal/util]

Rationalに変換する

Methods

Classes