Skip to main content
The Deno 2 Release Candidate is here
Learn more

Quantity Math for JavaScript/TypeScript

This is a library for dealing with numbers with units like “10 meters”.

Based on PQM, with extensive changes.

MIT licensed.

Basic Usage

Importing:

import { Quantity } from "./mod.ts";

Constructing a quantity value:

new Quantity(10, { units: "cm" });

Adding two quantities:

const x = new Quantity(5, { units: "m" });
const y = new Quantity(20, { units: "cm" });
const z = x.add(y);
z.toString(); // "5.2 m"

Multiplying two quantities:

const x = new Quantity(5, { units: "kg" });
const y = new Quantity(2, { units: "m" });
const z = x.multiply(y);
z.toString(); // "10 kg⋅m"

Serialize to simple object, using same units:

const x = new Quantity(5, { units: "lb" });
x.get(); // { magnitude: 5, units: "lb" }

Serialize to simple object, using specified units:

const x = new Quantity(10, { units: "cm" });
x.getWithUnits("in"); // { magnitude: 3.9370078740157486, units: "in" }

Simplify units:

const x = new Quantity(5, { units: "kg^2⋅m^2⋅s^-4⋅A^-2" });
x.getSI(); // { magnitude: 5, units: "kg/F" }

Error/uncertainty/tolerance

You can specify a “plus/minus” value (in the same units). Operations like addition and multiplication will preserve the plus/minus value, following the standard rules (i.e. addition adds the absolute uncertainty, multiplication adds the relative uncertainty, etc.).

const x = new Quantity(4.52, { units: "cm", plusMinus: 0.02 }); // 4.52±0.02 cm
const y = new Quantity(2.0, { units: "cm", plusMinus: 0.2 }); // 2±0.2 cm"
const z = x.multiply(y); // z = xy = 9.04 ± 0.944 cm²
z.get(); // { magnitude: 9.04, units: "cm^2", plusMinus: 0.944 }
z.toString(); // "9.0±0.9 cm^2" (toString() will automatically round the output)

Custom units

Any unit name that starts with an underscore is considered to be a base custom unit (prefixed custom units are not supported). So you can define and use arbitrary units on the fly:

const f = new Quantity(10, { units: "_foo" });
const b = new Quantity(2, { units: "_bar" });
const fb = f.multiply(b);
fb.toString(); // "20 _foo⋅_bar"
fb.multiply(f).toString(); // "200 _foo^2⋅_bar"

Development Roadmap / TODOs

  • Finish implementing “significant digits”
  • Implement more mathematical operations like division and exponentiation.
  • Add support for angular units, including converting radians to degrees and treating “angle” as a dimension, to avoid ambiguities with units like “rpm” and “Hz”.
  • Consider adding support for additional units (radiation, angles, more non-SI units). Note that this library generally tries not to support units that can be considered deprecated (like “bar”, “dram”, “furlong”, “league”, “poise”), etc. or that are ambiguous (like “ton”, “gallon”, etc.).