小ネタ〜Javascriptでの演算〜

Javascriptで小数値の演算を行う機会はあまりありませんが、
現在参画しているプロジェクトで、メンバーが入力値の妥当性チェックの
修正を行っている時に出てきた問題です。


実は、Javascriptは小数の演算が大の苦手です。
試しに、「0.1」を10回足してみて下さい。

var num = 0.1;
var retNum = num + num + ・・・ + num;

結果は「0.9999999999999999」と表示されます。
見ての通り「0.0000000000000001」足りませんね。


これを回避する手法は、「0.1」を10倍した値を10回足して、最後に10で割る方法が一般的です。

var num = 0.1;
var retNum = num * 10 + num * 10 + ・・・ + num * 10;
retNum /= 10;

結果は「1」と表示されました。
これでこの問題はクリアされました。



しかし、ここからが問題です。
次は「100.111」に「0.001」をかけた後、「0.1」を引いてみます。

var num1 = 100.111;
var num2 = 0.001;
var num3 = 0.1;

var retNum = num1 * 1000;
retNum *= (num2 * 1000) / 1000;
retNum -= (num3 * 1000);
retNum /= 1000;

結果は「0.0001110000000000042」と表示されます。
今度は「0.0000000000000000042」多いです。


Javascriptで四則演算を行うのは、もはや限界です。
よって、もう少し違う観点で考えてみましょう。
これを回避するポイントは『小数点』です。


数値を文字列として考え、小数点を整数になるまでシフトします。
その後演算を行い、最後にシフトした小数点を元の位置に付与します。


簡単にまとめると、常に整数計算を行えるように関数を準備することで、
この問題を回避することが可能です。


このような機会がありましたら、このことを思い出してください。
多少のお役に立てば幸いです。



ATS