私は最近、小数点以下数桁のエラーを一貫して返すプログラムをデバッグしていました。エラーは、チェックする必要がないと私が信じていたまさにその行にあったことがわかりました999999 * (.18 / 12)
。
数学的には、式は存在に関係なく同じ答えに評価されるはずなので、括弧は必要ないことはわかっていましたが、わかりやすくするために括弧を含めました。ただし、Pythonインタープリターにステートメントを入力すると、が返されましたが14999.98499999999
、正解は。である必要があります14999.985
。かっこを外して入力すると999999 * .18 / 12
、正解(14999.985
)が返ってきました。Pythonだけではないことを確認するために、Javaでも試してみました。同じ答えです。
どうしてこれなの?コンピューターは分数を正確な値として保存できないことを理解しているので、ある程度の誤差が予想されますが、コンピューターがこれら2つのステートメントを評価する方法の違いは何ですか?
TL; DR:数学的な場合と999999 * (.18 / 12)
は異なる答えが得られますが、どちらも。と評価する必要があります。なんで?999999 * .18 / 12
14999.985