はじめに
コジマです。
小数点の計算により小数点の十三位くらいに謎の端数が発生することがあります。
console.log(1350*1.1) // => 1485.0000000000002
例えば、消費税計算するときに小数点以下を繰り上げで表示したい場合、
上記の例だと1485が正解なのに、以下のように1486となってしまいます。
console.log(1350*1.1) // => 1486
こういう事象に対処する方法を紹介したいと思います。
他の記事は最後に記載するライブラリを使うやり方だったり、
めっちゃ面倒な関数作ったりしていたので、もっと簡易的に実装したいなと思って模索した結果です。
一つご理解いただきたいのが、あくまで簡易的な対応であり、有効数字の桁数の大きい精密な計算では応用効かないかもしれません。
対処
必要な小数点の桁数だけずらしてから元に戻すことを考えます。
消費税の場合は%なので、計算した数を100倍して、小数点以下を切り落としてから100で割ります。
そうすることによって誤差で発生した端数を無視します。
console.log(Math.ceil(Math.floor((1350*1.1)*100)/100)) // => 1485
最低でもこれで小数点第二位の粒度では対応できそうです。
さいごに
簡易的に小数点誤差に対応する方法を紹介しました。
正確にやるにはdecimal.jsなどのjsライブラリがあるらしいので
気になる方は調べてみてください。
誤差が発生する原因は、数値計算がIEEE 754に準拠しているからとのことですが、
まだその理解が咀嚼できていないので、引き続き勉強していくとします。
この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!
システムエンジニアのつらい部分のあるあるなんかをエンタメにしたチャンネルを作りました。
チャンネルはこちら
つらい部分も楽しくなればと思っているのでよかったらチャンネル登録や高評価してくれたらうれしいです。
もっと学びたい人はこちら
JavaScriptをもっと学びたいエンジニアのためにおすすめのUdemy講座を紹介いたします!
JavaScript初心者向けの講座です。
HTML、CSSと合わせて学ぶことができます。
フロントエンド開発の基本的な知識を網羅的に学ぶことができます。
個人的には著作権表記についても触れているところが推せますね。
ウェブ開発入門完全攻略コース – HTML/CSS/JavaScript. プログラミングをはじめて学び創れる人へ!
JavaScriptをより深く学びたい人はこちらがおすすめです。
JavaScript初心者を脱するとよりよいコードを書かなければなりません。
つまずきがちなオブジェクト操作や、非同期処理の仕組みについて学ぶこともできるため、JavaScriptの仕組みから深く学ぶことができます。
【JS】ガチで学びたい人のためのJavaScriptメカニズム
気になった人はぜひ見てみてくださいね!
以上、コジマでした。