たとえば十進数の 0.1
という値を二進数で表現しようとしたとき、 0.0001100110011001100110011001100110011001100110011001101
というように同じパターンが無限に繰り返される循環小数となります。 十進数ではキリのよい値に見えても二進数の世界ではそうではありません。 double
型では正確に保持することが不可能なので double
型で格納しようとした段階で既に誤差が生まれています。
質問の事例では、数式上なら 1
ピッタリになるはずのときに実際には誤差で 0.999999999999988
となっているので d >= 1
が偽となり想定通り動いていませんでした。
小数点数を等号で比較するのはほぼ常に誤りだと言っても過言ではありません。 私も文字として処理するのが妥当だと思いますが、どうしても double
の計算としてやりたいということであればあり得る誤差の幅の分だけ余裕をもって判定するという方法をとれなくはないです。 しかしどれだけの誤差があり得るのか、余裕をどう設定すればよいのか見積もる能力がない内にその方法をとるべきではないと私は考えます。