JS math.js を使ったメモ

2022/07/08に公開

浮動小数点の都合でどうしても .0000000002 とかでてしまうアレの対応をするために、PHP だと bcmath 等があるのですが、JSではどうするのかなぁと調べたら math.js とドンピシャな物があります。

かなり高級なライブラリで math.evaluate("0.1 + 0.2")math.evaluate('12.7 cm to inch') も計算してくれるみたいです。

高機能がちょっと多くて、自分が使う範疇のみメモ書き。そんなに込み入った使い方はしない。

0.1 + 0.2 問題

よくある物として 0.1 + 0.2 をすると 0.30000000000000004 になって丸め誤差がでてきます。うっかりこの状態で切り上げなどをすると変な 1 が出てきたりして、その1で問題を起こすってことが稀にあります。Math.ceil とかで小数点第二位以下を切り捨てとかしたいですが、JS の標準ではできません(たぶん) Math.ceil() -- developer.mozilla.org

mathjs を使えば math.ceil(math.add(0.1, 0.2), 2) とかすれば 0.3 と返してくれてます。そして数値比較にも使えます。

例えば Javascript で (0.1 + 0.2) === 0.3 は偽になりますが、math.equal(0.1+0.2, 0.3) は真を返します。

使い方的なメモ

ライブラリを素のまま使う方法?と、数式を解釈する方法と、chain で計算式をメソッドチェーンでつなげていく方法があります。

Extension

カスタム定数などを入れてゴニョゴニョできるみたいです。

math.import({
  taxrate: 0.1,
})

math.evaluate( "1200 * ( 1.0 + taxrate)" ); // 1320

使い方

基本的なメソッドは https://mathjs.org/docs/reference/functions.html#arithmetic-functions に書いています。JS にある Math ライブラリを拡張したような感じで使えます。

使い方: 足し算

  • math.add(a, b)
  • math.chain(a).add(b)

使い方: 引き算

  • math.subtract(1, 2)
  • math.chain(a).subtract(b).done()

使い方: 割り算

  • math.divide(1,2)
  • math.chain(a).divice(b)

使い方: 掛け算

  • math.multiply(2,3); // 6
  • math.chain(2).multiply(3);

使い方: 余り

4%6 === 2 の計算

  • math.mod(6, 4); // 2
  • math.chain(6).mod(4); // 2

使い方: 余剰

  • math.pow(3,3); // 27
  • math.chain(3).pow(3)

使い方: 数式

数式をそのまま流し込んで使うことができます。

const subset = { x: 1024 };

math.evaluate("x ^ 2 / x + 12", subset) // 1036

Discussion