JavaScriptの数値演算で発生するよくあるエラーと対処法
生徒
「先生、JavaScriptで数字を使った計算をするときに、思わぬ結果になることがあります。これはなぜですか?」
先生
「それはJavaScriptの数値演算が持つ特性や注意点によるものです。特に小数の計算や特別な値の扱いでエラーや予期しない結果が出やすいです。」
生徒
「具体的にはどのようなエラーですか?」
先生
「代表的なものとして、浮動小数点の誤差、ゼロ除算、NaNの発生があります。それぞれの原因と対処法を詳しく見ていきましょう。」
1. 浮動小数点の誤差
JavaScriptでは小数を二進数で表すため、計算結果にわずかな誤差が生じることがあります。これは「浮動小数点誤差」と呼ばれ、特に金融計算などで注意が必要です。
console.log(0.1 + 0.2); // 0.30000000000000004
0.30000000000000004
対処法としては、toFixedで小数点の桁数を指定したり、整数に変換して計算する方法があります。
let result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result); // 0.3
0.3
2. ゼロでの除算
数値をゼロで割ると、JavaScriptではエラーを投げるのではなく、特殊な値が返されます。正のゼロで割るとInfinity、負のゼロで割ると-Infinityになります。
console.log(10 / 0); // Infinity
console.log(-10 / 0); // -Infinity
Infinity
-Infinity
Infinityや-Infinityは数値型ですが、計算に使うと予期せぬ結果になることがあるため、事前にisFiniteでチェックすると安全です。
3. NaN(Not a Number)の発生
数値計算中に非数の値を操作すると、NaN(Not a Number)が返されます。これは計算が無効であることを示す特別な値です。
console.log("abc" / 2); // NaN
console.log(Math.sqrt(-1)); // NaN
NaN
NaN
NaNが計算に混ざると、以降の計算もNaNになってしまうので、isNaNやNumber.isNaNで判定して処理を分けることが重要です。
4. 大きすぎる数値や小さすぎる数値
JavaScriptの数値型はNumberで表されますが、扱える最大値と最小値があります。これを超えるとInfinityや- Infinityになります。
console.log(Number.MAX_VALUE * 2); // Infinity
console.log(Number.MIN_VALUE / 2); // 0
Infinity
0
計算前にNumber.isFiniteを使って範囲チェックを行うと、想定外の結果を防げます。
5. 対処法のまとめ
数値演算で発生するよくあるエラーの対策は以下の通りです。
- 浮動小数点誤差:
toFixedや整数化で対応 - ゼロ除算:
isFiniteでチェック - NaNの発生:
isNaNやNumber.isNaNで確認 - 数値の範囲外:
Number.MAX_VALUEやNumber.MIN_VALUEを使ってチェック
これらを意識することで、JavaScriptの数値演算でのトラブルを大幅に減らせます。