【Javaの基礎】Javaの変数(浮動小数点型)

 

こんにちは、SEの「とも」です。

今回は、「浮動小数点型」について書いていきたいと思います。

 

【浮動小数点型】

浮動小数点型には、以下の種類の型があります。

違いは「消費するメモリのサイズ」と、「精度の高さ」です。

 

まずは、浮動小数点型の種類を見ていきましょう。

 

必要なメモリサイズ 説明
float 4バイト(32ビット) 単精度浮動小数点型
double 8バイト(64ビット) 倍精度浮動小数点型

 

説明欄にある、単精度や倍精度って何なのか?という話なんですが、これは精度の違いになります。

 

floatとdoubleでは、表現できる小数点以下の桁数が違うので、double型の方が精度が高くなり、誤差が小さくなります。

誤差が小さくなるため、floatよりもdouble型の方が通常は良く使われます

floatを使用するのは、ゲームのように「メモリの消費量を抑えたい」かつ、「精度が荒くても問題ない」場合ですね。

 

ただし、注意点として浮動小数点型は思っている以上に誤差が発生します

例えば、0.1を10回足しても1になりません。

 

  • これは、2進数により小数点以下を表現するため、10進数で切りの良い数値でも表現ができない場合があるからです。

例えば、10進数でも1/3が0.333333…といったように表現できなかったりしますよね。

これと同じで表現できない数値では四捨五入などによる誤差が発生します。

 

そのため、演算を積み重ねると徐々に誤差が積み上がってきます

 

精度を重視するのであれば、10進数で表現できるBigDecimal型がよく利用されます

BigDecimal型は参照型に分類されるものなので、別の記事にて説明します。

 

  • 精度が悪いのに浮動小数点型が良く利用されるのは「取り扱いが簡単」、「処理速度が早い」という理由があげられます。

 

誤差はいくつかの理由で発生しますが、代表的なものとしては以下のようなことがあります。

  • 2進数で表現できない数値を四捨五入などで丸める誤差
  • 大きい数字と小さい数字を足したり引いたりする際に小さい数字が切り捨てられる誤差

 

誤差は積みあがるものなので何度も計算するわけではなかったり、消費税計算などの厳密さが要求される場面以外では、浮動小数点での演算で十分まかなえます。

 

浮動小数点ではどのように小数点以下を表現しているのかというと、次のように指数を使って表現します。

指数部を使うことで、すごく大きい数や、すごく小さい数を表現することができるんです。

 

  • 1234 → 表現:1.234e3(1.234 × 10の3乗)

 

  • 0.001234 → 表現:1.234e-3(1.234 × 10の-3乗)

 

小数点以下の表現が必要な時は、

  • 通常の小数点以下の演算ならdouble
  • 正確な数値が必要ならBigDecimal
  • メモリ消費量を抑え、かつ、精度が不要ならfloat

と覚えておくといいかなと思います。

 

次回は、文字型について書きたいと思います。