いさむの泡沫備忘録

泡沫(うたかた)のように消えてしまう記憶を、備忘録として残していきます。

JavaScriptの小数点計算で誤差が出る

JavaScript で小数点の切り上げをしようとしたら、

切り上げなくてもよい場合まで切り上げされてしまいました。 

どうやら小数の計算をすると、第14位に「1」が入ってきてしまうようですね。

var hoge = 0.01;

 

// 有効桁数は2のため、100倍する

hoge = hoge * 100; // 「1.00000000000001」

// 小数がある場合は切り上げする

hoge = Math.ceil(hoge); // 「2」

// 有効桁数は2なので、100を割る

hoge = hoge / 100;  // 「0.02」

「0.01 × 100 = 1.00000000000001」…!?どうしてこうなった。。。

 

回避策として、文字列にして切り上げするのが良いようです。

次のような感じにして乗り切りました。

var hoge = 0.01;

var decimal = 2;
var dotPosition = 0;

// 有効桁数分「0」を付ける

hogehoge + Array(decimal).join('0'); // 「0.0100」
   
// 小数点が存在するか確認
if(hoge.lastIndexOf('.') > 0){
      // 小数点があったら位置を取得
      dotPosition = hoge.lastIndexOf('.');

      // 小数点の位置をずらす

      hoge = hoge.replace('.', '') + decimal;
      hoge = hoge.slice(0, dotPosition) + '.' + hoge.slice(dotPosition); //「001.00」

      // 切り上げて、10のn乗(小数点をずらした数)を割る

      Math.ceil(parseFloat(hoge)) / Math.pow(10, decimal); // 「1 / 100 = 0.01」
}

 

四捨五入や切り捨てだと気にしなくてもいいかもですが、切り上げの場合は悪魔ですね。。。

 

悪魔さんにはお帰り願いたい笑