JavaScriptの小数点計算で誤差が出る
JavaScript で小数点の切り上げをしようとしたら、
切り上げなくてもよい場合まで切り上げされてしまいました。
どうやら小数の計算をすると、第14位に「1」が入ってきてしまうようですね。
var hoge = 0.01;
// 有効桁数は2のため、100倍する
hoge = hoge * 100; // 「1.00000000000001」
// 小数がある場合は切り上げする
hoge = Math.ceil(hoge); // 「2」
// 有効桁数は2なので、100を割る
「0.01 × 100 = 1.00000000000001」…!?どうしてこうなった。。。
回避策として、文字列にして切り上げするのが良いようです。
次のような感じにして乗り切りました。
var hoge = 0.01;
var decimal = 2;
var dotPosition = 0;// 有効桁数分「0」を付ける
hoge = hoge + 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」
}
四捨五入や切り捨てだと気にしなくてもいいかもですが、切り上げの場合は悪魔ですね。。。
悪魔さんにはお帰り願いたい笑