「BigDecimal」の編集履歴(バックアップ)一覧はこちら
BigDecimal - (2009/03/18 (水) 20:54:38) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*BigDecimal
Javaにおいてjava.math.BigDecimalクラスは固定小数点数を扱うクラスです。
浮動小数点数は2の乗数分の1を足して小数の計算をしますが、それでは誤差が発生してしまうことがあります。
固定小数点数だと、「整数値×10の乗数」として整数部の計算と小数点の位置の計算を分けて行うのでより正確な値が返ります。
ちなみにdecimalとは「小数」、「小数の」、「10進法の」などという意味だそうです。
BigDecimalのコンストラクタは以下のようなものがあります。
BigDecimal(BigInteger val)
BigIntegerをBigDecimalに変換します。
BigDecimal(BigInteger unscaledVal, int scale)
BigIntegerのスケールなしの値とintスケールをBigDecimalに変換します。
BigDecimal(double val)
doubleをBigDecimalに変換します。
BigDecimal(String val)
BigDecimalのString表現をBigDecimalに変換します。
----
**BigDecimal 使用例 1
BigDecimalの基本的な計算を行うメソッドを使ってみます。
addメソッド:加算
multiplyメソッド:乗算
divideメソッド:除算
BigDecimalSample1.java
import java.math.BigDecimal;
class BigDecimalSample1 {
public static void main(String[] args) {
BigDecimal bigDecimalObject1 = new BigDecimal("0.5");
BigDecimal bigDecimalObject2 = new BigDecimal("0.25");
System.out.println("bigDecimalObject1\t:\t" + bigDecimalObject1);
System.out.println("bigDecimalObject2\t:\t" + bigDecimalObject2);
// add(BigDecimal val) メソッド:加算
System.out.println("bigDecimal add\t\t:\t" + bigDecimalObject1.add(bigDecimalObject2));
// multiply(BigDecimal val) メソッド:乗算
System.out.println("bigDecimal multiply\t:\t" + bigDecimalObject1.multiply(bigDecimalObject2));
// divide(BigDecimal val) メソッド:除算
System.out.println("bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2));
}
}
実行結果
C:\java>javac BigDecimalSample1.java
C:\java>java BigDecimalSample1
bigDecimalObject1 : 0.5
bigDecimalObject2 : 0.25
bigDecimal add : 0.75
bigDecimal multiply : 0.125
bigDecimal divide : 2
----
**BigDecimal 使用例 2 (divide)
上記のプログラムのbigDecimalObject2のデータの値を0.255などとするとdivideメソッドでjava.lang.ArithmeticExceptionが起こります。
ArithmeticExceptionは算術計算で例外的条件が発生した場合にスローされます。
これは丸めモードを指定していないためです。以下のメソッドを使うと正常に動作します。
divide(BigDecimal val, int roundingMode)
divide(BigDecimal val, int scale, int roundingMode)
scaleにはスケールを指定します。
roundingModeには丸めモードを指定します。
BigDecimalSample2.java
import java.math.BigDecimal;
class BigDecimalSample2 {
public static void main(String[] args) {
BigDecimal bigDecimalObject1 = new BigDecimal("0.5");
BigDecimal bigDecimalObject2 = new BigDecimal("0.255");
System.out.println("bigDecimalObject1\t:\t" + bigDecimalObject1);
System.out.println("bigDecimalObject2\t:\t" + bigDecimalObject2);
// divide(BigDecimal val, int scale, RoundingMode roundingMode)
System.out.println(
"bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2, 3, BigDecimal.ROUND_HALF_UP));
// divide(BigDecimal val, int scale, RoundingMode roundingMode)
System.out.println(
"bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2, 7, BigDecimal.ROUND_HALF_UP));
}
}
実行結果
C:\java>java BigDecimalSample2
bigDecimalObject1 : 0.5
bigDecimalObject2 : 0.255
bigDecimal divide : 1.961
bigDecimal divide : 1.9607843
----
**スケール・丸めモード
固定小数点数の場合、「整数値×10の乗数」として整数部の計算と小数点の位置の計算を分けて行います。
スケールは10×-?乗の?のことです。
以下の場合「3」、「7」が各々のスケールになります。
1.961 = 1961 × 10の-3乗
1.9607843 = 19607843× 10の-7乗
丸めモードは丸め処理のモードを指定するものです。
BigDecimalのフィールドに丸めモードを指定するための定数が用意されています。
static int ROUND_CEILING
正の無限大に近づくように丸めるモードです。
static int ROUND_DOWN
0 に近づくように丸めるモードです。
static int ROUND_FLOOR
負の無限大に近づくように丸めるモードです。
static int ROUND_HALF_DOWN
「もっとも近い数字」 に丸めるモードです。
static int ROUND_HALF_EVEN
「もっとも近い数字」 に丸めるモードです。
static int ROUND_HALF_UP
「もっとも近い数字」に丸めるモードです。
static int ROUND_UNNECESSARY
要求される演算の結果が正確であり、丸めが必要でないことを表す丸めモードです。
static int ROUND_UP
0 から離れるように丸めるモードです。
----
*BigDecimal
Javaにおいてjava.math.BigDecimal[[クラス]]は固定小数点数を扱うクラスです。
浮動小数点数は2の乗数分の1を足して小数の計算をしますが、それでは誤差が発生してしまうことがあります。
固定小数点数だと、「整数値×10の乗数」として整数部の計算と小数点の位置の計算を分けて行うのでより正確な値が返ります。
ちなみにdecimalとは「小数」、「小数の」、「10進法の」などという意味だそうです。
BigDecimalのコンストラクタは以下のようなものがあります。
BigDecimal(BigInteger val)
BigIntegerをBigDecimalに変換します。
BigDecimal(BigInteger unscaledVal, [[int]] scale)
BigIntegerのスケールなしの値とintスケールをBigDecimalに変換します。
BigDecimal([[double]] val)
doubleをBigDecimalに変換します。
BigDecimal([[String]] val)
BigDecimalのString表現をBigDecimalに変換します。
----
**BigDecimal 使用例 1
BigDecimalの基本的な計算を行うメソッドを使ってみます。
addメソッド:加算
multiplyメソッド:乗算
divideメソッド:除算
BigDecimalSample1.java
import java.math.BigDecimal;
class BigDecimalSample1 {
public static void main(String[] args) {
BigDecimal bigDecimalObject1 = new BigDecimal("0.5");
BigDecimal bigDecimalObject2 = new BigDecimal("0.25");
System.out.println("bigDecimalObject1\t:\t" + bigDecimalObject1);
System.out.println("bigDecimalObject2\t:\t" + bigDecimalObject2);
// add(BigDecimal val) メソッド:加算
System.out.println("bigDecimal add\t\t:\t" + bigDecimalObject1.add(bigDecimalObject2));
// multiply(BigDecimal val) メソッド:乗算
System.out.println("bigDecimal multiply\t:\t" + bigDecimalObject1.multiply(bigDecimalObject2));
// divide(BigDecimal val) メソッド:除算
System.out.println("bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2));
}
}
実行結果
C:\java>javac BigDecimalSample1.java
C:\java>java BigDecimalSample1
bigDecimalObject1 : 0.5
bigDecimalObject2 : 0.25
bigDecimal add : 0.75
bigDecimal multiply : 0.125
bigDecimal divide : 2
----
**BigDecimal 使用例 2 (divide)
上記のプログラムのbigDecimalObject2のデータの値を0.255などとするとdivideメソッドでjava.lang.ArithmeticExceptionが起こります。
ArithmeticExceptionは算術計算で例外的条件が発生した場合にスローされます。
これは丸めモードを指定していないためです。以下のメソッドを使うと正常に動作します。
divide(BigDecimal val, int roundingMode)
divide(BigDecimal val, int scale, int roundingMode)
scaleにはスケールを指定します。
roundingModeには丸めモードを指定します。
BigDecimalSample2.java
import java.math.BigDecimal;
class BigDecimalSample2 {
public static void main(String[] args) {
BigDecimal bigDecimalObject1 = new BigDecimal("0.5");
BigDecimal bigDecimalObject2 = new BigDecimal("0.255");
System.out.println("bigDecimalObject1\t:\t" + bigDecimalObject1);
System.out.println("bigDecimalObject2\t:\t" + bigDecimalObject2);
// divide(BigDecimal val, int scale, RoundingMode roundingMode)
System.out.println(
"bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2, 3, BigDecimal.ROUND_HALF_UP));
// divide(BigDecimal val, int scale, RoundingMode roundingMode)
System.out.println(
"bigDecimal divide\t:\t" + bigDecimalObject1.divide(bigDecimalObject2, 7, BigDecimal.ROUND_HALF_UP));
}
}
実行結果
C:\java>java BigDecimalSample2
bigDecimalObject1 : 0.5
bigDecimalObject2 : 0.255
bigDecimal divide : 1.961
bigDecimal divide : 1.9607843
----
**スケール・丸めモード
固定小数点数の場合、「整数値×10の乗数」として整数部の計算と小数点の位置の計算を分けて行います。
スケールは10×-?乗の?のことです。
以下の場合「3」、「7」が各々のスケールになります。
1.961 = 1961 × 10の-3乗
1.9607843 = 19607843× 10の-7乗
丸めモードは丸め処理のモードを指定するものです。
BigDecimalのフィールドに丸めモードを指定するための定数が用意されています。
static int ROUND_CEILING
正の無限大に近づくように丸めるモードです。
static int ROUND_DOWN
0 に近づくように丸めるモードです。
static int ROUND_FLOOR
負の無限大に近づくように丸めるモードです。
static int ROUND_HALF_DOWN
「もっとも近い数字」 に丸めるモードです。
static int ROUND_HALF_EVEN
「もっとも近い数字」 に丸めるモードです。
static int ROUND_HALF_UP
「もっとも近い数字」に丸めるモードです。
static int ROUND_UNNECESSARY
要求される演算の結果が正確であり、丸めが必要でないことを表す丸めモードです。
static int ROUND_UP
0 から離れるように丸めるモードです。
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: