書き方
書き方は単純なのですが、調べても全然出てこなかった!!
models/Hoge.rb
class Hoge < ApplicationRecord
BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_DOWN)
belongs_to :foobar
end
例外処理
計算結果が非数(NaN)やゼロによる除算になったときの処理を定義することができます。
flag = false # デフォルト値
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)
require 'bigdecimal'
flag = false # デフォルト値
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)
BigDecimal::EXCEPTION_NaN は結果が NaN になったときの指定です。
BigDecimal::EXCEPTION_INFINITY は結果が無限大(±Infinity)になったときの指定です。
BigDecimal::EXCEPTION_UNDERFLOW は指数部がアンダーフローするときの指定です。
BigDecimal::EXCEPTION_OVERFLOW は指数部がオーバーフローするときの指定です。
BigDecimal::EXCEPTION_ZERODIVIDE はゼロによる割り算を実行したときの指定です。
BigDecimal::EXCEPTION_ALL は、可能な全てに対して一括して設定するときに使用します。
flag が true のときは、指定した状態になったときに例外を発行するようになります。 flag が false(デフォルト)なら、例外は発行されません。計算結果は以下のようになります。
BigDecimal::EXCEPTION_NaN のとき、非数(NaN)
BigDecimal::EXCEPTION_INFINITY のとき、無限(+ or -Infinity)
BigDecimal::EXCEPTION_UNDERFLOW のとき、ゼロ
BigDecimal::EXCEPTION_OVERFLOW のとき、+Infinity か -Infinity
BigDecimal::EXCEPTION_ZERODIVIDE のとき、+Infinity か -Infinity
BigDecimal::EXCEPTION_INFINITY、BigDecimal::EXCEPTION_OVERFLOW、 BigDecimal::EXCEPTION_ZERODIVIDE は今のところ同じです。戻り値は、設定後の値です。「値」の意味は、例えば BigDecimal::EXCEPTION_NaN と「値」の & が ゼロ以外ならば BigDecimal::EXCEPTION_NaNが設定されているという意味です。
丸め処理指定
計算途中の丸め操作の指定ができます。
BigDecimal::ROUND_UP 全て切り上げます。
BigDecimal::ROUND_DOWN 全て切り捨てます(truncate)。
BigDecimal::ROUND_HALF_UP 四捨五入します(デフォルト)。
BigDecimal::ROUND_HALF_DOWN 五捨六入します。
BigDecimal::ROUND_HALF_EVEN 四捨六入します。5の時は上位1桁が奇数の時のみ繰り上げます(Banker's rounding)。
BigDecimal::ROUND_CEILING 数値の大きい方に繰り上げます(ceil)。
BigDecimal::ROUND_FLOOR 数値の小さい方に繰り下げます(floor)。