日々ブログ

当サイトは、アフィリエイトプログラムにより商品をご紹介しています

【プログラミング】javascriptの計算精度について調べてみた話

f:id:xinformation:20210807210422p:plain 最近、javascriptを利用していて何故か計算が合わないという事態があり、javascriptには、ちょっと変わった計算精度があることを知りました。
どのプログラミング言語にも計算精度は存在するのですが、簡単な掛け算で発生したり、javascriptはちょっと複雑な事情できまっていることが分かったので記事にしたいと思います。

プログラムにおける計算精度って?

プログラムの計算精度には限界があります。
コンピュータの中身は数字を2進数で扱っており、また数字を表すための2進数の文字数も決まっています。 64bitアーキテクチャやら32 bit アーキテクチャなどを聞いたことはないでしょうか。この32やら64がbit2進数で表せる文字数に関係してきます。
c言語を利用している方はよくご存知と思います。
身近な例としては、円周率の計算があります。
円周率は数字の羅列では表せない無理数なのですが、この計算精度を競う研究があり、また、より精度良く計算できる機械を作れることが技術アピールになるので、向上する度に話題になったりするわけです。

javascript における計算精度の詳細

プログラミング言語としては珍しくjavascriptにおける計算精度は共通規格(IEEE754)で定まっています。
他の言語とは異なり、ブラウザごとにjavascriptの実行エンジンが異なるためでしょう。
こうした差異によって、利用者が不利益を被らないよう共通規格によって互換性が保たれているようです。

IEEE754 の規格

wikipedia に詳細な説明があるので、ここで詳しく述べるのは控えます。ここの記述を見ると少数点を用いた計算の際に誤差が出てくるようです。
ただ、この規格は年を経ると改訂するのですが、2008版までの記述しか見受けられませんでした。より詳しく調べたい方は、ieee のサイトより購入できるので、一読されてはいかがでしょうか。

ieeexplore.ieee.org

計算精度を担保するための方法

上の例の場合は、少数を持った計算を行なっていることが原因です。
なので、予め整数部と少数部に変数を分けて、少数部を整数になるまで桁上げし、所望の計算を終えた後に桁上げした分を桁下げすれば回避することができます。
ただし、この方法は、かなり面倒です。
正直なところ計算精度を求めるような計算はjavascriptではなく、サーバーで計算した方することをおすすめします。