ブログ


Javaでの正確な計算を実現する数値型の使い分け
こんにちは!Ry.Kです。
プログラムを書いていると、数値の計算や型変換の場面でどの型を使うべきか迷うことがあります。今回、Javaを使用した開発の際に、数値計算を含む処理を実装する中で改めて数値型について考える機会があったので、簡単に整理してみました。
基本的な数値型について
Javaにはいくつかの数値型が用意されています。代表的なものは「整数型」と「浮動小数点型」です。
また、精度を重視したいときにはBigDecimal
やBigInteger
といったオブジェクト型も利用できます。
この記事では特によく使う 整数型(int/long)、浮動小数点型(float/double)、そしてBigDecimal
を取り上げます。
整数型について
整数を扱うときにはbyte
、short
、int
、long
の4種類があります。
このうちbyte
とshort
は使われる機会が少ないため、ここでは利用頻度の高いint
とlong
に絞って紹介します。
int
は32ビットの整数で、配列のインデックスやカウンターなどに広く利用されます。
long
は64ビット整数で、ユーザーIDや大きな金額など、int
では足りない場合に使います。
int a = 100;
long b = 1234567890123L;
多くのケースではint
で十分ですが、値がint
の範囲(約21億)を超える可能性がある場合はlong
を使うのが安全です。
浮動小数点型について
小数を扱うときにはfloat
とdouble
を使います。float
は32ビットの精度を持ち、約7桁の有効桁数を表現でき、double
は64ビットの精度を持ち、約16桁の有効桁数を表現できます。
float
は精度は限定されますが、計算速度が速くメモリ消費も少ないため、大量データの処理やパフォーマンス重視の計算に向いています。
一方、double
はfloat
に比べて計算コストがやや高いものの、精度が高いという特徴があります。
そのため、科学計算や統計処理といった精度が求められる用途で広く使われています。
しかし、double
を使っても「厳密な小数」を正確に表現できるわけではなく、計算の過程で誤差が生じることがあります。
double a = 0.1;
double b = 0.2;
double sum = a + b;
System.out.println(sum);
// 出力: 0.30000000000000004
一見単純な計算でも、このように結果がわずかにズレることがあるため注意が必要です。
正確な計算を実現するためには?
プログラムでは金額やポイントなど「誤差を許せない計算」を扱うことがよくあります。
しかし、double
を使った計算では、先ほど見たようにわずかな誤差が発生する可能性があります。
そこで登場するのがBigDecimal
です。
BigDecimal
は任意精度の小数を扱えるため、金額計算のように誤差が許されない場面で活躍します。
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b);
System.out.println(sum);
// 出力: 0.3
このように、double
のような誤差は発生せず正確に計算できます。
さらに、小数点以下の桁数を指定して四捨五入したり、計算ごとに精度を調整したりすることも可能です。
まとめ
今回はJavaの数値型について簡単に整理してみました。
整数型や浮動小数点型、そして正確な計算が必要な場面でのBigDecimal
など、どの型にもそれぞれ特長と注意点があります。
状況に応じて適切に使い分けることで、計算ミスや誤差を防ぎ、より安全で正確なプログラムを書くことができます。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!