Javaには浮動小数点数を表すための2つの主な型があります:float(32ビット)およびdouble(64ビット)。floatは精度が低く、メモリを節約しますが、doubleはより高い精度を提供し、浮動小数点数に対してデフォルトで推奨される型です。
重要な特性:
デルタを用いた比較の例:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("誤差を考慮して等しい"); } else { System.out.println("等しくない"); } } }
質問:次のコードは何を出力しますか?
System.out.println(0.1 + 0.2 == 0.3);
回答:このコードはfalseを出力します。なぜなら、0.1 + 0.2の合計はIEEE 754の二進数形式では0.3と正確には等しくないためです。
物語
ある大規模な金融プロジェクトで、資金カウンターとしてdouble型が使用されました。実際には小さな操作が丸め誤差の蓄積を引き起こし、結果的に合計が数セントずれてしまうことがありました。この問題はdoubleをBigDecimalに置き換えることで解決されました。
物語
ゲームエンジンで、オブジェクトの座標を保存するためにfloatの配列が使用されていました。大きな距離を移動するとオブジェクトの位置精度が失われ、画面上でのオブジェクトが「震える」現象が発生しました。floatをdoubleに置き換え、座標を中心にすることで問題が解決されました。
物語
統計解析プログラムでは、
==演算子を使ってdoubleの値を比較し、予期しない数の「不一致」が発生していました。デルタを用いた比較に変更したことで、プログラムの論理が正しく動作するようになりました。