1. 概要

このチュートリアルでは、Javaの浮動小数点型の整数部分と小数部分、つまりfloatdoubleを分離するさまざまな方法について説明します。

2. フローティングポイントタイプに関する問題

まず、簡単な分数と、キャストを介して分離を実行する素朴な方法を見てみましょう。

double doubleNumber = 24.04;
int intPart = (int) doubleNumber;
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + intPart);
System.out.println("Decimal Part: " + (doubleNumber - intPart));

上記のコードを実行しようとすると、次のようになります。

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.03999999999999915

予想に反して、出力は小数部を正しく出力しません。 したがって、浮動小数点数は、丸め誤差が許容できない計算には適していません。

3. 最初のアプローチ:文字列を分割する

まず、10進数をStringに相当するものに変換しましょう。 次に、Stringを小数点インデックスで分割できます。

例を使ってこれを理解しましょう:

double doubleNumber = 24.04;
String doubleAsString = String.valueOf(doubleNumber);
int indexOfDecimal = doubleAsString.indexOf(".");
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + doubleAsString.substring(0, indexOfDecimal));
System.out.println("Decimal Part: " + doubleAsString.substring(indexOfDecimal));

上記のコードの出力は次のとおりです。

Double Number: 24.04
Integer Part: 24
Decimal Part: .04

出力はまさに私たちが期待するものです。 ただし、ここでの問題は、文字列の使用の制限です。つまり、他の算術演算を実行できなくなります。

4. 2番目のアプローチ:BigDecimalを使用する

JavaのBigDecimalクラスは、ユーザーに丸め動作の完全な制御を提供します。 このクラスは、算術演算、スケール操作、丸め、比較、ハッシュ、およびフォーマット変換の操作も提供します。

BigDecimal を使用して、浮動小数点数の整数部分と小数部分を取得してみましょう。

double doubleNumber = 24.04;
BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber));
int intValue = bigDecimal.intValue();
System.out.println("Double Number: " + bigDecimal.toPlainString());
System.out.println("Integer Part: " + intValue);
System.out.println("Decimal Part: " + bigDecimal.subtract(
  new BigDecimal(intValue)).toPlainString());

出力は次のようになります。

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.04

上記のように、出力は期待どおりです。 BigDecimalクラスで提供されるメソッドを使用して算術演算を実行することもできます。

5. 結論

この記事では、浮動小数点型の整数部分と小数部分を分離するさまざまな方法について説明しました。 また、浮動小数点の計算にBigDecimalを使用する利点についても説明しました。

また、JavaBigDecimalとBigIntegerに関する詳細なチュートリアルでは、2つのクラスのより多くの特性と使用シナリオについて説明しています。

最後に、このチュートリアルの完全なソースコードは、GitHubで入手できます。