日本語
AIで作った計算機は正しい?「101円の半額」で確かめる
1,200円の20%引きが960円。合っていても、その計算機が正しいとは限りません。答えを先に手計算で決め、端数の出る例で照合する。 小さなアプリを確認するなら、ここから始められます。
この記事では、101円の半額が50円になってしまう教材コードを使い、誤りの発見から修正後の再確認まで試します。特定のAI製品を使った開発実験ではありません。
まず「正解のルール」を固定する
今回の計算機は、次の仕様とします。
- 元値は0〜1,000,000,000円、割引率は0〜100%。どちらも整数
- 最後の支払額を1円単位で四捨五入し、ちょうど0.5円は切り上げる
- 税、送料、複数の割引は扱わない
- 計算関数は数値だけを受け付け、空欄や文字列、小数、範囲外の値はエラーにする
この丸め方は教材の約束です。すべての店に共通する会計ルールではありません。実際の用途では、先に採用するルールを決めます。
Microsoftも、AIが生成したコードを読み、十分にテストし、入力の型や範囲を検証するよう案内しています。Microsoft Learn
AIの答えを見る前に、期待値を残す
101円の50%引きなら、支払額は101×50÷100=50.5円。約束した四捨五入で51円です。これを「期待値」として保存します。計算機が出した数字をそのまま正解欄へ写してはいけません。
次に、丸める境目の前後も確かめます。
表は横にスクロールできます(キーボードの左右キーにも対応)
1円の例は、実際の買い物らしさより「どこで答えが変わるか」を見るために選んでいます。
もっともらしい誤りを見つける
故意に間違えた版は、値引き額を先に丸めます。
値引き額:101×50÷100=50.5円 → 51円
支払額:101-51=50円
引き算そのものは合っています。しかし「最後の支払額を丸める」という仕様から外れています。1,200円の20%引きでは両方とも960円になるため、普通の例だけでは見逃します。
修正版は、支払額を直接求めます。
支払額=(元値×(100-割引率)+50)を100で割った整数部分
101円なら(101×50+50)÷100=51円です。実装はBigIntで整数計算し、小数の金額を途中に持ちません。入力はNumber.isSafeIntegerで確認します。これらの動作はMDNで確認できます。BigInt、Number.isSafeInteger
同じ試験で、壊れる版と直した版を比べる
2026年10月10日、Node.js v24.19.0で計算関数を実行しました。通常値と端数、金額上限、0%・100%、不正な入力、連続計算を含む35ケースです。
- 故障版:32件成功、3件失敗
- 修正版:35件成功、0件失敗
失敗したのは101円・1円の50%引きと、その誤りを含む連続計算です。3種類の別の欠陥を見つけた、という意味ではありません。
連続計算は「1,200円の20%引き → 101円の50%引き → 最初と同じ計算」とし、960→51→960を確認しました。空文字を渡してエラーになった後、正しい入力で再計算する試験もあります。
教材コード、試験コード、実行ログを残しています。再現方法はREADMEへ。修正時も期待値を変えず、同じ試験をもう一度実行してください。GitHubの公式ガイドも、失敗するテストが削除・スキップされていないかを見るよう促しています。GitHub Docs
合格したのは計算関数まで
画面への入力、文字列から数値への変換、エラー表示、ボタンの連打、スマートフォン表示は未検証です。35件の成功は全入力の証明でも、公開可能という判定でもありません。
自分のアプリへ移すなら、まずこの表の値を実際の画面から入れ、表示と計算結果が一致するか確かめます。そこが未確認なら公開を急がなくて大丈夫です。期待値、実行した結果、まだ試していない部分を分けて残せれば、AIの「完成しました」より具体的に次の作業を決められます。