BigDecimalの仕組みを図解してみた。

目次

  • 基本的な構造
  • スケールを変える
  • 足し算
  • 引き算
  • 掛け算
  • 割り算

基本的な構造

BigDecimalは数値を整数部とスケールで表現します。スケールとは小数点以下の桁数のことです。
(例) 1.234

スケールを変える

スケールの変更はBigDecimalの基本的な操作です。足し算、引き算、割り算と値の比較でも使われます。

基本的な考え方
  • スケール(小数点位置)を変更する。
  • なるべく、実質的に値を変えない。(例:2.5と2.50は実質的に同じ値)
スケールを増やす

2.5のスケールを「2」にする例。

  1. 実質的に値を変えず、小数点以下の桁数を「2」に変える。(2.5→2.50)
  2. 小数点を除いて、実際の値(250)を整数値に転記する。
  3. スケールを「2」にする。
スケールを減らす

2.50のスケールを「1」にする例。

  1. 実質的に値を変えず、小数点以下の桁数を「1」に変える。(2.50→2.5)
  2. 小数点を除いて、実際の値(25)を整数値に転記する。
  3. スケールを「1」にする。
スケールを減らす(丸め処理が必要)

2.5のスケールを「0」にする例。

  1. 値の丸め処理をして、小数点以下の桁数を「0」に変える。(2.5→2 or 3)
  2. 小数点を除いて、実際の値(2 or 3)を整数値に転記する。
  3. スケールを「0」にする。

足し算

基本的な考え方
  • 足し合わせる値のスケールを同じにする。
    • スケールの大きい方に合わせる。
  • 整数部を足し算する。
足し算手順

(例) 12.3 + 0.29 = 12.59

引き算

基本的な考え方
  • 引き算する値のスケールを同じにする。
    • スケールの大きい方に合わせる。
  • 整数部を引き算する。
引き算手順

(例) -2.74 − 14 = -16.74

掛け算

基本的な考え方
  • スケールを足し算する。
  • 整数部を掛け算する。
掛け算手順

(例) 0.012 × 2.3 = 0.0276


割り算

基本的な考え方
  • 結果の値のスケールを指定できる。
  • スケールを調整する。
    • 「割られる値のスケール」−「割る値のスケール」=「結果の値のスケール」となるように調整する。
  • 整数部を割り算する。
    • 商と余りを求める。
  • 余りがある場合、丸め処理をする。
割り算手順

(例) 1.75 ÷ 6 = 0.292 or 0.291 (結果のスケールを「3」にする)





※実際のコード例は、BigDecimalの仕組みを利用してみた。をご覧ください。