BigDecimal
日本語 | 大十進数クラス |
英語 | big decimal |
ふりがな | びっぐでしまる |
フリガナ | ビッグデシマル |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.math.BigDecimal。
実数値を格納するためのクラス。 ただし、格納方法は浮動小数点ではない。
double型のような浮動小数点形式で実数を処理すると、丸め誤差が生まれる。そのため、正確な値を格納するために、浮動小数点ではない丸め誤差の発生しない方法で値を格納するのがBigDecimalクラスである。
BigDecimalクラスでは、実数値を「整数値」として扱い、この値と「小数点の位置」を別々に管理することで、実数値を丸め誤差なしに格納する。
格納された値は、BigDecimalクラスのメソッドで四則演算や比較を行うことができる。逆に言うと、BigDecimalクラスからdouble型等で値を取り出すと、その時点で丸め誤差が生まれ、値が正確ではなくなってしまう。
これは、BigDecimalクラスに値を格納する段階でも言える。BigDecimalクラスに格納する前にdouble型等の変数に実数値が格納されていればその時点で丸め誤差が生じるため、BigDecimalクラスを使用する意味がなくなる。
BigDecimalクラスは「文字列型」の実数値を変換して取り込む事ができるため、たとえばWebアプリケーションの場合、画面から入力された段階ではStringクラスに格納し、それを直接BigDecimalクラスに渡し、演算後、文字列化して画面に返すのがよい。
BigDecimalクラスの文字列化にはDecimalFormatクラスが向いている。DecimalFormatクラスを使用することで、小数点の桁数やカンマを付けることができる。
実数値を格納するためのクラス。 ただし、格納方法は浮動小数点ではない。
double型のような浮動小数点形式で実数を処理すると、丸め誤差が生まれる。そのため、正確な値を格納するために、浮動小数点ではない丸め誤差の発生しない方法で値を格納するのがBigDecimalクラスである。
BigDecimalクラスでは、実数値を「整数値」として扱い、この値と「小数点の位置」を別々に管理することで、実数値を丸め誤差なしに格納する。
格納された値は、BigDecimalクラスのメソッドで四則演算や比較を行うことができる。逆に言うと、BigDecimalクラスからdouble型等で値を取り出すと、その時点で丸め誤差が生まれ、値が正確ではなくなってしまう。
これは、BigDecimalクラスに値を格納する段階でも言える。BigDecimalクラスに格納する前にdouble型等の変数に実数値が格納されていればその時点で丸め誤差が生じるため、BigDecimalクラスを使用する意味がなくなる。
BigDecimalクラスは「文字列型」の実数値を変換して取り込む事ができるため、たとえばWebアプリケーションの場合、画面から入力された段階ではStringクラスに格納し、それを直接BigDecimalクラスに渡し、演算後、文字列化して画面に返すのがよい。
BigDecimalクラスの文字列化にはDecimalFormatクラスが向いている。DecimalFormatクラスを使用することで、小数点の桁数やカンマを付けることができる。
参考サイト
// Sample.java
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Sample
{
public static void main( String[] args )
{
// 出力フォーマットを用意しておきます。
String format = "0.00000000000000000000";
DecimalFormat decimalFormat = new DecimalFormat( format );
// BigDecimalクラスを作成します。
// 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
// 文字列から作ります。javaコマンドの引数で渡されてきたり、
// Webの画面から渡されてきたり、プロパティファイルから
// 渡されてきた場合でも、BigDecimalクラスに渡すまで文字列で持っておきましょう。
BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
// add()メソッドで足します。
BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 12.30000000000000000000
// このように、BigDecimalクラスであれば丸め誤差が発生しません。
// その他、四則演算や比較演算子が備わっています。
// 引き算( bigDecimal1 - bigDecimal2 )。
bigDecimalResult = bigDecimal1.subtract( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// -4.10000000000000000000
// 掛け算( bigDecimal1 * bigDecimal2 )。
bigDecimalResult = bigDecimal1.multiply( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 33.62000000000000000000
// 割り算( bigDecimal1 / bigDecimal2 )。
// 四捨五入モードで計算します。
bigDecimalResult = bigDecimal1.divide( bigDecimal2, BigDecimal.ROUND_HALF_UP );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 0.50000000000000000000
// 比較
int compareResult = bigDecimal1.compareTo( bigDecimal2 );
System.out.println( compareResult );
// -1
// bigDecimal1 < bigDecimal2 なのでマイナスになります。
// このように、BigDecimalクラスに入れたままで、たいがいの事はできます。
// 逆にdouble型などで取り出すとその時点で丸め誤差が生じてしまうため、
// できる限りBigDecimalクラスだけで処理するようにしましょう。
}
}
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Sample
{
public static void main( String[] args )
{
// 出力フォーマットを用意しておきます。
String format = "0.00000000000000000000";
DecimalFormat decimalFormat = new DecimalFormat( format );
// BigDecimalクラスを作成します。
// 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
// 文字列から作ります。javaコマンドの引数で渡されてきたり、
// Webの画面から渡されてきたり、プロパティファイルから
// 渡されてきた場合でも、BigDecimalクラスに渡すまで文字列で持っておきましょう。
BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
// add()メソッドで足します。
BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 12.30000000000000000000
// このように、BigDecimalクラスであれば丸め誤差が発生しません。
// その他、四則演算や比較演算子が備わっています。
// 引き算( bigDecimal1 - bigDecimal2 )。
bigDecimalResult = bigDecimal1.subtract( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// -4.10000000000000000000
// 掛け算( bigDecimal1 * bigDecimal2 )。
bigDecimalResult = bigDecimal1.multiply( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 33.62000000000000000000
// 割り算( bigDecimal1 / bigDecimal2 )。
// 四捨五入モードで計算します。
bigDecimalResult = bigDecimal1.divide( bigDecimal2, BigDecimal.ROUND_HALF_UP );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 0.50000000000000000000
// 比較
int compareResult = bigDecimal1.compareTo( bigDecimal2 );
System.out.println( compareResult );
// -1
// bigDecimal1 < bigDecimal2 なのでマイナスになります。
// このように、BigDecimalクラスに入れたままで、たいがいの事はできます。
// 逆にdouble型などで取り出すとその時点で丸め誤差が生じてしまうため、
// できる限りBigDecimalクラスだけで処理するようにしましょう。
}
}
// Sample.java import java.math.BigDecimal; import java.text.DecimalFormat; public class Sample { public static void main( String[] args ) { // 出力フォーマットを用意しておきます。 String format = "0.00000000000000000000"; DecimalFormat decimalFormat = new DecimalFormat( format ); // BigDecimalクラスを作成します。 // 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、 // 文字列から作ります。javaコマンドの引数で渡されてきたり、 // Webの画面から渡されてきたり、プロパティファイルから // 渡されてきた場合でも、BigDecimalクラスに渡すまで文字列で持っておきましょう。 BigDecimal bigDecimal1 = new BigDecimal( "4.1" ); BigDecimal bigDecimal2 = new BigDecimal( "8.2" ); // add()メソッドで足します。 BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 ); System.out.println( decimalFormat.format( bigDecimalResult ) ); // 12.30000000000000000000 // このように、BigDecimalクラスであれば丸め誤差が発生しません。 // その他、四則演算や比較演算子が備わっています。 // 引き算( bigDecimal1 - bigDecimal2 )。 bigDecimalResult = bigDecimal1.subtract( bigDecimal2 ); System.out.println( decimalFormat.format( bigDecimalResult ) ); // -4.10000000000000000000 // 掛け算( bigDecimal1 * bigDecimal2 )。 bigDecimalResult = bigDecimal1.multiply( bigDecimal2 ); System.out.println( decimalFormat.format( bigDecimalResult ) ); // 33.62000000000000000000 // 割り算( bigDecimal1 / bigDecimal2 )。 // 四捨五入モードで計算します。 bigDecimalResult = bigDecimal1.divide( bigDecimal2, BigDecimal.ROUND_HALF_UP ); System.out.println( decimalFormat.format( bigDecimalResult ) ); // 0.50000000000000000000 // 比較 int compareResult = bigDecimal1.compareTo( bigDecimal2 ); System.out.println( compareResult ); // -1 // bigDecimal1 < bigDecimal2 なのでマイナスになります。 // このように、BigDecimalクラスに入れたままで、たいがいの事はできます。 // 逆にdouble型などで取り出すとその時点で丸め誤差が生じてしまうため、 // できる限りBigDecimalクラスだけで処理するようにしましょう。 } }