0.1,0.2,0.3のように小数点を含む値を与えられた際にそのまま足すと、タイトルのようにすごく小さな値が末尾についてしまいます。
これは、浮動小数点数の計算において生じる精度の問題によるものです。JavaScriptの浮動小数点数は、2進数で数値を表現するため、10進数の小数を完全に正確に表現できないことがあります。その結果、小数点以下の桁数が無限に続くような場合に、数値計算の結果が予想外に少し違って見えることがあります。
具体的には、0.1や0.2といった10進数の小数は、2進数で正確に表現できないため、計算に誤差が生じることがあります。そのため、数回の加算操作を行った結果、わずかながら誤差が蓄積され、0.1 + 0.2 + 0.3 のような計算でも、理論的には 0.6 になるべきところ、JavaScriptでは 0.6000000000000001 のような結果になることがあります。
const lines = [0.1, 0.2, 0.3];
let sum = 0;
for (let i = 0; i < lines.length; i++) {
sum += parseFloat(lines[i]);
}
console.log(sum);
このような誤差を回避するためには、計算結果を表示する際に丸める方法を取ることがあります。たとえば、計算結果を小数点以下2桁に丸める場合は、次のようにすることができます。
const lines = [0.1, 0.2, 0.3];
let sum = 0;
for (let i = 0; i < lines.length; i++) {
sum += parseFloat(lines[i]);
}
sum = sum.toFixed(1);
console.log(sum);
この仕様に気づかずに問題を解いていたため、なぜ不正解になるのかわかりませんでした。
逐一、計算結果を確認するのは大事ですね。。。