The Useful Question
日本語

AIで作った計算機は正しい?「101円の半額」で確かめる

1,200円の20%引きが960円。合っていても、その計算機が正しいとは限りません。答えを先に手計算で決め、端数の出る例で照合する。 小さなアプリを確認するなら、ここから始められます。

この記事では、101円の半額が50円になってしまう教材コードを使い、誤りの発見から修正後の再確認まで試します。特定のAI製品を使った開発実験ではありません。

まず「正解のルール」を固定する

今回の計算機は、次の仕様とします。

この丸め方は教材の約束です。すべての店に共通する会計ルールではありません。実際の用途では、先に採用するルールを決めます。

Microsoftも、AIが生成したコードを読み、十分にテストし、入力の型や範囲を検証するよう案内しています。Microsoft Learn

AIの答えを見る前に、期待値を残す

101円の50%引きなら、支払額は101×50÷100=50.5円。約束した四捨五入で51円です。これを「期待値」として保存します。計算機が出した数字をそのまま正解欄へ写してはいけません。

次に、丸める境目の前後も確かめます。

表は横にスクロールできます(キーボードの左右キーにも対応)
元値割引率丸める前の支払額期待値
1,200円20%960円960円
101円50%50.5円51円
1円51%0.49円0円
1円50%0.50円1円
1円49%0.51円1円

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ケースです。

失敗したのは101円・1円の50%引きと、その誤りを含む連続計算です。3種類の別の欠陥を見つけた、という意味ではありません。

連続計算は「1,200円の20%引き → 101円の50%引き → 最初と同じ計算」とし、960→51→960を確認しました。空文字を渡してエラーになった後、正しい入力で再計算する試験もあります。

教材コード、試験コード、実行ログを残しています。再現方法はREADMEへ。修正時も期待値を変えず、同じ試験をもう一度実行してください。GitHubの公式ガイドも、失敗するテストが削除・スキップされていないかを見るよう促しています。GitHub Docs

合格したのは計算関数まで

画面への入力、文字列から数値への変換、エラー表示、ボタンの連打、スマートフォン表示は未検証です。35件の成功は全入力の証明でも、公開可能という判定でもありません。

自分のアプリへ移すなら、まずこの表の値を実際の画面から入れ、表示と計算結果が一致するか確かめます。そこが未確認なら公開を急がなくて大丈夫です。期待値、実行した結果、まだ試していない部分を分けて残せれば、AIの「完成しました」より具体的に次の作業を決められます。