Precision | サンプルソース | |
---|---|---|
小数の精度の問題にクローズアップ。小数点は、使用上の注意をよく読んで、用法・用量を守ってお使いください。 |
Precision.java |
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "Precision" * Precision.java 「小数の精度を検証する」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac Precision.java * >java Precision * 【キーワード】 * 整数(integer), 単精度(single precision), 倍精度(double precision), * 浮動小数点(floating point number), 10進数,(decimal), 2進数(binary), * リテラル(literal) * 【試してみよう】 * int型の「変数」同士を計算して、bouble型の結果を求める。 * BigDecimalクラスを利用して、誤差を生じさせず0.1を10回足し合わせる。 */ import java.lang.String; import java.lang.System; public class Precision { public static void main(String[] A00) { System.out.println("リテラルの計算"); System.out.println("整数(int)演算 :10 / 3 = " + (10 / 3)); System.out.println("単精度(float)演算 :10F / 3F = " + (10F / 3F)); System.out.println("倍精度(double)演算:10D / 3D = " + (10D / 3D)); System.out.println("倍精度(double)演算:10.0 / 3.0 = " + (10.0 / 3.0)); System.out.println(); System.out.println("0.1を10回足し合わせた結果は..."); double L00 = 0.0; for (int L01 = 0; L01 < 10; L01++) { L00 += 0.1; } System.out.println("なんと、1.0じゃなくて " + L00); } } /* ■ クラスの外でちょっと一言 ■ Javaにおける数式の計算結果は、式に含まれる値の型によって変化します。整数 同士の計算なら結果も整数。"15 / 10 = 1.5"ではなくて、"15 / 10 = 1"ですの で、お間違えなきよう。 じゃあ、整数同士を演算して小数の結果を得たい場合にはどうする? まず、型を指定してリテラルを記述するという方法があります。リテラルとは ソースの中に直接書き込まれた値のこと。数値の末尾にFまたはfがあればfloat 型、Dまたはdがあればdouble型と解釈されます。また、"15.0"のようにわざと小 数点をつけるという方法もあります。この場合、数値はdouble型として解釈され ます。 コンピュータの世界の小数には、「精度」という概念があるのも知っておく必要 があります。これはどこまで小数点以下を表現するかということで、逆の言い方 をすれば、小数のずーっと末端部分は打ち切られているということになります。 実行結果を見ていただければ、floatとdoubleの打ち切り方の違いが分かるで しょう。 もう一つ、コンピュータの世界の小数で留意すべき点に、「10進数との誤差」が あります。実は10進数の小数を2進数で表現することは不可能で、0.1という数字 ですら、それに最も近い浮動小数点によって表されてます。10回足しても1.0に ならないのはその誤差のためです。 こういうことは、知ってれば「そんなもんか」と思えますが、知らなかったら、 「Javaは小学生レベルの計算も出来んのか!!」と怒っちゃいそうですよね。 BigDecimalを使えば誤差のない計算が出来ますので、ご安心を。 */