Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

mathjsでcm、inchのような単位が混在した計算を扱う

JavaScriptの数学系を拡張するmathjsは、行列から複素数、cmといった生活単位、果ては原子物理の定数までサポートする驚愕のライブラリです。
今回はcmやinchといった、長さを扱う別の単位が混在した式を楽にする方法を扱います。

実際のところ

生活単位の計算

mathjsはcmといった生活上よく使う単位を記号つきで扱う機能があります。

var a = math.unit(55, 'cm')
/*
{ [String: '55 cm']
  units: [ { unit: [Object], prefix: [Object], power: 1 } ],
  dimensions: [ 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  value: 0.55,
  fixPrefix: false,
  isUnitListSimplified: true }
*/

var b = math.unit(100, 'cm')
/*
{ [String: '100 cm']
  units: [ { unit: [Object], prefix: [Object], power: 1 } ],
  dimensions: [ 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  value: 1,
  fixPrefix: false,
  isUnitListSimplified: true }
*/

計算するときは若干注意が必要です。
何も考えないで足し算すると、文字列化されてしまいます。

a + b
// 55 cm100 cm

ここはmathjs経由で計算するようにしましょう

var c = math.add(a,b)
/*
{ [String: '155 cm']
  units: [ { unit: [Object], prefix: [Object], power: 1 } ],
  dimensions: [ 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  value: 1.55,
  fixPrefix: false,
  isUnitListSimplified: true }
*/

これだけだとナンのありがたみも無さそうですが……
mathjsは別種の単位を混在して使うこともできるのです。

var d = math.add(math.unit(4,'inch'),math.unit(20,'cm'))
/*
{ [String: '11.874015748031496 inch']
  units: [ { unit: [Object], prefix: [Object], power: 1 } ],
  dimensions: [ 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  value: 0.3016,
  fixPrefix: false,
  isUnitListSimplified: true }
*/

(おまけ)学問の定数

電磁気学で使うようなμも、量子力学なんかで使うプランク定数系までサポートしています。
プランク単位系 - Wikipedia
学部教科書レベルならブラウザ上で難なく計算できそうです……スゴイ時代になったものですね。

参考もと

mathjs.org