【AI生成コードの落とし穴】0.1 + 0.2 はなぜ「0.30000000000000004」になる?
一見シンプルでも、バグは潜んでいる……
「0.1 + 0.2」という簡単な小数の足し算をしてみましょう。
疑う余地なく、答えは「0.3」 ですよね。
ただ、JavaScript で計算してみると、以下のような結果に……。
console.log(0.1 + 0.2); // → 0.30000000000000004
こんなに簡単な計算にもかかわらず、間違った結果が出ています。
しかし、これはJavaScriptの不具合ではなく、コンピュータの数値処理に起因する仕様です。
なぜこんなことが起きるのか
コンピュータは 2進数(バイナリ)で数値を扱っています。
ところが 「0.1」や 「0.2」 は、2進数では 正確に表せない無限小数になるため、内部的には「ほぼ0.1」「ほぼ0.2」のように近似値で扱われます。
その結果、計算結果も以下のような微妙な誤差を含むことになるのです。
(0.10000000000000000555...) + (0.20000000000000001110...) = 0.30000000000000004
※ このような誤差は、表現誤差(representation error)と丸め誤差(rounding error)というものが重なって起こります。
誰でも開発できる時代?
最近では、ChatGPTやGitHub Copilot などの生成AIによって、「非エンジニアでも開発できる時代が来た」と言われるようになってきました。
たしかに、フォームの作成やページ遷移など、よくある機能のコード例を出力することは可能です。しかし、それをそのまま製品に使えるかというと、かなり無理があるように思えます。
エンジニアにとっては初歩的な小数誤差の問題ひとつとっても、そもそも知り得なければ対策もできません。
落とし穴はコードの裏側に
今回のような小数誤差の問題をはじめ、コードには表からは見えにくい落とし穴が無数にあります。
一見、正しく動いているように見えても、ある条件下で破綻したり、微妙な仕様の違いが意図しない動作につながったりすることは珍しくありません。
こうした問題の多くは、「なぜこう書くべきか」を理解していないと気づけません。AIは“それっぽいコード”は書けても、例外や誤差への備えまで含めた堅実な設計までは自動では対応できません。
そもそもAIが出力するコードは、多くの場合特定のライブラリや実行環境における“正常系のみ”での動作しか想定されていません。しかし実際の開発現場では、正常系こそが特殊なケースであり、異常系や想定外の環境への対応こそが品質を左右します。
専門家不在の開発は可能か
AIは、ツールとして非常に強力です。
でも、それをどう使いこなすか、どこで人間が介入すべきかは、経験と知識による判断が必要です。
ちなみに、今回のような小数計算のズレについては、ケースに応じて 任意精度ライブラリを使ったり、小数が入り込まないような設計をして処理します。こうした対応ができるかどうかが、「動くコード」と「信頼できる製品」の分かれ道になります。
知識がなくてもAIで開発ができる時代は、もう少し先になりそうです。
株式会社オートプロジェクトでは、中小企業向けのシステム・アプリケーション開発 / 外注サービスを提供しております。
貴社のニーズに応じた柔軟なサポートを行いますので、ぜひお気軽にご相談ください。
