みかづきブログ・カスタム

基本的にはちょちょいのほいです。

浮動小数点を意識したコードを書く 📝

JavaScriptでは数値が64ビットの浮動小数点数で表されます。

突然ですが、問題です。
0.3 / 0.1の答えは幾つになるでしょう。

普通に考えれば3になります。
では、JavaScriptで計算してみましょう。

2.9999999999999996となりました。
なぜならば、前述の通り、JavaScriptでは数値が64ビットの浮動小数点数で表されるからです。

詳しい仕様は Number の項目をみていただきたいのですが、ざっくりいうと、信頼できる小数点以下は15~17桁程度のようです。

developer.mozilla.org

計算結果が大体あっていればOKの場合、つまり、0.3 / 0.1の答えが、3でも2.9999999999999996でもOKの場合は特に対策せずに計算を行っても良いかもしれません。

しかし、絶対に3が返ってきて欲しい場合、一旦整数に直してから計算するなどの工夫が必要になります。

const significantDigits = 4;

console.log(Math.round(0.3 * Math.pow(10, significantDigits)) / Math.round(0.1 * Math.pow(10, significantDigits))); // => 3

という感じで計算すれば、有効数字4桁で四捨五入した結果を計算するので、ぴったり3が返ってきます。