実数
日本語 | 小数点付き数値 |
英語 | real number |
ふりがな | じっすう |
フリガナ | ジッスウ |
小数を持つ値。
「3.1」や「2.0」といった数。小数点以下の値を持たない「整数」に対して、実数は小数点以下を持つ。
整数との大きな違いは、小数点以下は「桁溢れ」が当然のように発生するという点である。整数での「上限の桁溢れ」は、大きな値を掛け合わせたりしない限り発生しないが、小数点の「下限の桁溢れ」は、2/3といった「割り切れない計算」で簡単に発生する。
そのため、実数の表現方法には様々な方法がある。「小数点以下何桁までを格納するか」によってメモリの使用量や計算速度、そして値の正確さがが大きく変わるためである。使用する側は、その目的によって方法を選択する必要がある。
Javaでは主に「浮動小数点」と「BigDecimalクラス」の2種類の方法がある。
「浮動小数点」は64ビットサイズと比較的サイズが小さく、またCPUが計算をサポートしている場合もあるため処理が早いが、常に丸め誤差が生じる危険性があるため、正確な値が必要な場合は使用すべきではない。
「BigDecimalクラス」は、BigDecimalクラスという専用のクラスを用いて計算を行うため、非常に桁数が多く、しかも正確という利点がある。ただし、複雑な計算を大量に行うと、思いの外時間が掛かる場合もある。
基本的にはBigDecimalクラスを使用し、やむを得ない場合にのみ浮動小数点の使用をお勧めする。
もっとも、この他にも、自分でクラスなりアルゴリズムを作るなりしてもよいし、他のライブラリを使用することもできる。
「3.1」や「2.0」といった数。小数点以下の値を持たない「整数」に対して、実数は小数点以下を持つ。
整数との大きな違いは、小数点以下は「桁溢れ」が当然のように発生するという点である。整数での「上限の桁溢れ」は、大きな値を掛け合わせたりしない限り発生しないが、小数点の「下限の桁溢れ」は、2/3といった「割り切れない計算」で簡単に発生する。
そのため、実数の表現方法には様々な方法がある。「小数点以下何桁までを格納するか」によってメモリの使用量や計算速度、そして値の正確さがが大きく変わるためである。使用する側は、その目的によって方法を選択する必要がある。
Javaでは主に「浮動小数点」と「BigDecimalクラス」の2種類の方法がある。
「浮動小数点」は64ビットサイズと比較的サイズが小さく、またCPUが計算をサポートしている場合もあるため処理が早いが、常に丸め誤差が生じる危険性があるため、正確な値が必要な場合は使用すべきではない。
「BigDecimalクラス」は、BigDecimalクラスという専用のクラスを用いて計算を行うため、非常に桁数が多く、しかも正確という利点がある。ただし、複雑な計算を大量に行うと、思いの外時間が掛かる場合もある。
基本的には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 );
// Javaでは、普通の小数点付き数値は「浮動小数点リテラル」です。
// 浮動小数点では丸め誤差がつきものです。
System.out.println( decimalFormat.format( 4.1 + 8.2 ) );
// 12.29999999999999900000000000000000000000000000000000
// このように、浮動小数点は「正確な値を表現する」目的には使用できません。
// 同じ事をBigDecimalクラスでしてみます。
// 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
// 文字列から作ります。
BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 12.30000000000000000000
// このように、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 );
// Javaでは、普通の小数点付き数値は「浮動小数点リテラル」です。
// 浮動小数点では丸め誤差がつきものです。
System.out.println( decimalFormat.format( 4.1 + 8.2 ) );
// 12.29999999999999900000000000000000000000000000000000
// このように、浮動小数点は「正確な値を表現する」目的には使用できません。
// 同じ事をBigDecimalクラスでしてみます。
// 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
// 文字列から作ります。
BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
System.out.println( decimalFormat.format( bigDecimalResult ) );
// 12.30000000000000000000
// このように、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 ); // Javaでは、普通の小数点付き数値は「浮動小数点リテラル」です。 // 浮動小数点では丸め誤差がつきものです。 System.out.println( decimalFormat.format( 4.1 + 8.2 ) ); // 12.29999999999999900000000000000000000000000000000000 // このように、浮動小数点は「正確な値を表現する」目的には使用できません。 // 同じ事をBigDecimalクラスでしてみます。 // 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、 // 文字列から作ります。 BigDecimal bigDecimal1 = new BigDecimal( "4.1" ); BigDecimal bigDecimal2 = new BigDecimal( "8.2" ); BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 ); System.out.println( decimalFormat.format( bigDecimalResult ) ); // 12.30000000000000000000 // このように、BigDecimalクラスであれば丸め誤差が発生しません。 } }