Michael Greminger 6fa589057e
Big Number Format Fixes (#2956)
* test: format bignumber to engineering bug

Add tests for correctly handling starting with more then 3 sig figs and targeting 1 or 2 sig figs

* lint:

* lint: reduce number literal sig figs

* fix: engineering notation for bignumber input

Corrects handling of cases where the input has 3 or more sig figs and the output is set to 1 or 2 sig figs.

* test: add negative format bignumber precision test

* fix: use BigNumber for all branches in toEngineering

Also, remove string type option from JSDoc for toEngineering since string does support the required interface for the function (the .e property, .mul member function, and the .constructor property would not be correct after this change)

* fix: precision 0 for fixed notation and bignumber

This fix differentiates precision === 0 and precision === undefined to.
After fix, format bignumber for precision 0 matches format number for precision 0.

Tests added as well

---------

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2023-06-13 10:39:44 +02:00

401 lines
29 KiB
JavaScript

// test format
import assert from 'assert'
import math from '../../../../src/defaultInstance.js'
describe('format', function () {
it('should format numbers', function () {
assert.strictEqual(math.format(2 / 7), '0.2857142857142857')
assert.strictEqual(math.format(0.10400), '0.104')
assert.strictEqual(math.format(2.3), '2.3')
assert.strictEqual(math.format(2.3e6), '2.3e+6')
})
it('should format strings', function () {
assert.strictEqual(math.format('hello'), '"hello"')
})
it('should format arrays', function () {
assert.strictEqual(math.format([[1, 2], [3, 4]]), '[[1, 2], [3, 4]]')
const array = [[math.unit(2 / 3, 'm'), 2 / 7], ['hi', math.complex(2, 1 / 3)]]
assert.strictEqual(math.format(array, 5), '[[0.66667 m, 0.28571], ["hi", 2 + 0.33333i]]')
})
it('should format complex values', function () {
assert.strictEqual(math.format(math.divide(math.complex(2, 5), 3)), '0.6666666666666666 + 1.6666666666666667i')
assert.strictEqual(math.format(math.divide(math.complex(2, 5), 3), 5), '0.66667 + 1.6667i')
assert.strictEqual(math.format(math.divide(math.complex(2, 5), 3), { notation: 'fixed', precision: 1 }), '0.7 + 1.7i')
assert.strictEqual(math.format(math.divide(math.complex(6, 9), 3), { notation: 'fixed' }), '2 + 3i')
assert.strictEqual(math.format(math.complex(NaN, NaN)), 'NaN + NaNi')
assert.strictEqual(math.format(math.complex(Infinity, Infinity)), 'Infinity + Infinityi')
assert.strictEqual(math.format(math.complex(Infinity, -Infinity)), 'Infinity - Infinityi')
})
describe('precision', function () {
it('should format numbers with given precision', function () {
assert.strictEqual(math.format(1 / 3), '0.3333333333333333')
assert.strictEqual(math.format(1 / 3, 3), '0.333')
assert.strictEqual(math.format(1 / 3, 4), '0.3333')
assert.strictEqual(math.format(1 / 3, 5), '0.33333')
assert.strictEqual(math.format(math.complex(1 / 3, 2), 3), '0.333 + 2i')
})
it('should format complex numbers with given precision', function () {
assert.strictEqual(math.format(math.complex(1 / 3, 1 / 3), 3), '0.333 + 0.333i')
assert.strictEqual(math.format(math.complex(1 / 3, 1 / 3), 4), '0.3333 + 0.3333i')
})
it('should format matrices with given precision', function () {
assert.strictEqual(math.format([1 / 3, 1 / 3], 3), '[0.333, 0.333]')
assert.strictEqual(math.format([1 / 3, 1 / 3], 4), '[0.3333, 0.3333]')
assert.strictEqual(math.format(math.matrix([1 / 3, 1 / 3]), 4), '[0.3333, 0.3333]')
})
it('should format units with given precision', function () {
assert.strictEqual(math.format(math.unit(2 / 3, 'm'), 3), '0.667 m')
assert.strictEqual(math.format(math.unit(2 / 3, 'm'), 4), '0.6667 m')
})
it('should format ranges with given precision', function () {
assert.strictEqual(math.format(new math.Range(1 / 3, 4 / 3, 2 / 3), 3), '0.333:0.667:1.33')
})
})
describe('engineering notation', function () {
it('should format positive single digit to engineering notation', function () {
assert.strictEqual(math.format(3, { notation: 'engineering' }), '3e+0')
})
it('should format positive two digits to engineering notation', function () {
assert.strictEqual(math.format(30, { notation: 'engineering' }), '30e+0')
})
it('should format positive three digits to engineering notation', function () {
assert.strictEqual(math.format(300, { notation: 'engineering' }), '300e+0')
assert.strictEqual(math.format(320, { notation: 'engineering' }), '320e+0')
})
it('should format positive four digits to engineering notation', function () {
assert.strictEqual(math.format(3000, { notation: 'engineering' }), '3e+3')
})
it('should format positive uneven four digits to engineering notation', function () {
assert.strictEqual(math.format(3001, { notation: 'engineering' }), '3.001e+3')
})
it('should format a number without trailing zeros to engineering notation', function () {
assert.strictEqual(math.format(3010, { notation: 'engineering' }), '3.01e+3')
assert.strictEqual(math.format(452550000, { notation: 'engineering' }), '452.55e+6')
})
it('should format positive uneven ten digits to engineering notation', function () {
assert.strictEqual(math.format(3741293481, { notation: 'engineering' }), '3.741293481e+9')
})
it('should format negative uneven ten digits to engineering notation', function () {
assert.strictEqual(math.format(-3741293481, { notation: 'engineering' }), '-3.741293481e+9')
})
it('should format positive single digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(0.1, { notation: 'engineering' }), '100e-3')
})
it('should format positive two digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(0.01, { notation: 'engineering' }), '10e-3')
assert.strictEqual(math.format(0.011, { notation: 'engineering' }), '11e-3')
assert.strictEqual(math.format(0.0111, { notation: 'engineering' }), '11.1e-3')
})
it('should format positive three digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(0.003, { notation: 'engineering' }), '3e-3')
})
it('should format positive repeating three digit floating point numbers to engineering notation with precision', function () {
assert.strictEqual(math.format(1 / 3, { precision: 3, notation: 'engineering' }), '333e-3')
})
it('should format positive seven digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(0.1234567, { notation: 'engineering' }), '123.4567e-3')
})
it('should format negative single digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(-0.1, { notation: 'engineering' }), '-100e-3')
assert.strictEqual(math.format(-0.11, { notation: 'engineering' }), '-110e-3')
})
it('should format positive floating point number to engineering notation', function () {
assert.strictEqual(math.format(13308.0333333333, { precision: 11, notation: 'engineering' }), '13.308033333e+3')
})
it('should add or remove zeroes if necessary to output precision sig figs', function () {
assert.strictEqual(math.format(12400, { notation: 'engineering', precision: 2 }), '12e+3')
assert.strictEqual(math.format(12400, { notation: 'engineering', precision: 3 }), '12.4e+3')
assert.strictEqual(math.format(124000, { notation: 'engineering', precision: 3 }), '124e+3')
assert.strictEqual(math.format(124000, { notation: 'engineering', precision: 4 }), '124.0e+3')
assert.strictEqual(math.format(12400, { notation: 'engineering', precision: 7 }), '12.40000e+3')
assert.strictEqual(math.format(12400, { notation: 'engineering', precision: 8 }), '12.400000e+3')
assert.strictEqual(math.format(12400, { notation: 'engineering', precision: 9 }), '12.4000000e+3')
assert.strictEqual(math.format(-12400, { notation: 'engineering', precision: 7 }), '-12.40000e+3')
assert.strictEqual(math.format(0.0124, { notation: 'engineering', precision: 7 }), '12.40000e-3')
assert.strictEqual(math.format(0.00124, { notation: 'engineering', precision: 7 }), '1.240000e-3')
assert.strictEqual(math.format(0.000124, { notation: 'engineering', precision: 7 }), '124.0000e-6')
assert.strictEqual(math.format(0.000124, { notation: 'engineering', precision: 4 }), '124.0e-6')
assert.strictEqual(math.format(0.000124, { notation: 'engineering', precision: 3 }), '124e-6')
assert.strictEqual(math.format(1.24, { notation: 'engineering', precision: 3 }), '1.24e+0')
// less significant figures than precision, need to add zeros
assert.strictEqual(math.format(-1e12, { notation: 'engineering', precision: 3 }), '-1.00e+12')
assert.strictEqual(math.format(-1e11, { notation: 'engineering', precision: 3 }), '-100e+9')
assert.strictEqual(math.format(-1e10, { notation: 'engineering', precision: 3 }), '-10.0e+9')
assert.strictEqual(math.format(-1e9, { notation: 'engineering', precision: 3 }), '-1.00e+9')
assert.strictEqual(math.format(1e12, { notation: 'engineering', precision: 3 }), '1.00e+12')
assert.strictEqual(math.format(1e11, { notation: 'engineering', precision: 3 }), '100e+9')
assert.strictEqual(math.format(1e10, { notation: 'engineering', precision: 3 }), '10.0e+9')
assert.strictEqual(math.format(1e9, { notation: 'engineering', precision: 3 }), '1.00e+9')
assert.strictEqual(math.format(1e12, { notation: 'engineering', precision: 2 }), '1.0e+12')
assert.strictEqual(math.format(1e11, { notation: 'engineering', precision: 2 }), '100e+9')
assert.strictEqual(math.format(1e10, { notation: 'engineering', precision: 2 }), '10e+9')
assert.strictEqual(math.format(1e9, { notation: 'engineering', precision: 2 }), '1.0e+9')
assert.strictEqual(math.format(1e12, { notation: 'engineering', precision: 1 }), '1e+12')
assert.strictEqual(math.format(1e11, { notation: 'engineering', precision: 1 }), '100e+9')
assert.strictEqual(math.format(1e10, { notation: 'engineering', precision: 1 }), '10e+9')
assert.strictEqual(math.format(1e9, { notation: 'engineering', precision: 1 }), '1e+9')
assert.strictEqual(math.format(10e3, { notation: 'engineering', precision: 2 }), '10e+3')
assert.strictEqual(math.format(10e3, { notation: 'engineering', precision: 1 }), '10e+3')
assert.strictEqual(math.format(100e3, { notation: 'engineering', precision: 2 }), '100e+3')
assert.strictEqual(math.format(100e3, { notation: 'engineering', precision: 1 }), '100e+3')
assert.strictEqual(math.format(100, { notation: 'engineering', precision: 2 }), '100e+0')
assert.strictEqual(math.format(10, { notation: 'engineering', precision: 2 }), '10e+0')
assert.strictEqual(math.format(10, { notation: 'engineering', precision: 1 }), '10e+0')
assert.strictEqual(math.format(1, { notation: 'engineering', precision: 2 }), '1.0e+0')
assert.strictEqual(math.format(10e-3, { notation: 'engineering', precision: 2 }), '10e-3')
assert.strictEqual(math.format(100e-3, { notation: 'engineering', precision: 2 }), '100e-3')
assert.strictEqual(math.format(100e-3, { notation: 'engineering', precision: 1 }), '100e-3')
assert.strictEqual(math.format(1e-3, { notation: 'engineering', precision: 1 }), '1e-3')
assert.strictEqual(math.format(1e-4, { notation: 'engineering', precision: 1 }), '100e-6')
assert.strictEqual(math.format(1e-5, { notation: 'engineering', precision: 1 }), '10e-6')
assert.strictEqual(math.format(1e-6, { notation: 'engineering', precision: 1 }), '1e-6')
assert.strictEqual(math.format(1e-3, { notation: 'engineering', precision: 3 }), '1.00e-3')
assert.strictEqual(math.format(1e-4, { notation: 'engineering', precision: 3 }), '100e-6')
assert.strictEqual(math.format(1e-5, { notation: 'engineering', precision: 3 }), '10.0e-6')
assert.strictEqual(math.format(1e-6, { notation: 'engineering', precision: 3 }), '1.00e-6')
assert.strictEqual(math.format(-1e-3, { notation: 'engineering', precision: 3 }), '-1.00e-3')
assert.strictEqual(math.format(-1e-4, { notation: 'engineering', precision: 3 }), '-100e-6')
assert.strictEqual(math.format(-1e-5, { notation: 'engineering', precision: 3 }), '-10.0e-6')
assert.strictEqual(math.format(-1e-6, { notation: 'engineering', precision: 3 }), '-1.00e-6')
})
})
describe('non decimal base formatting', function () {
it('should format in binary, octal, and hexadecimal', function () {
assert.strictEqual(math.format(128, { notation: 'bin' }), '0b10000000')
assert.strictEqual(math.format(128, { notation: 'oct' }), '0o200')
assert.strictEqual(math.format(128, { notation: 'hex' }), '0x80')
assert.strictEqual(math.format(-128, { notation: 'hex' }), '-0x80')
assert.strictEqual(math.format(-128, { notation: 'hex', wordSize: 8 }), '0x80i8')
assert.strictEqual(math.format(127, { notation: 'hex', wordSize: 8 }), '0x7fi8')
assert.strictEqual(math.format(-1, { notation: 'hex', wordSize: 8 }), '0xffi8')
assert.strictEqual(math.format(1.25, { notation: 'bin' }), '0b1.01')
assert.strictEqual(math.format(1.25, { notation: 'oct' }), '0o1.2')
assert.strictEqual(math.format(1.25, { notation: 'hex' }), '0x1.4')
assert.strictEqual(math.bin(-128), '-0b10000000')
assert.strictEqual(math.bin(-128, 8), '0b10000000i8')
assert.strictEqual(math.oct(-128), '-0o200')
assert.strictEqual(math.oct(-128, 8), '0o200i8')
assert.strictEqual(math.hex(-128), '-0x80')
assert.strictEqual(math.hex(-128, 8), '0x80i8')
})
it('should throw an error for invalid values', function () {
assert.throws(function () { math.format(1.25, { notation: 'hex', wordSize: 8 }) }, 'Error: Value must be an integer')
assert.throws(function () { math.format(1, { notation: 'hex', wordSize: -8 }) }, 'Error: size must be greater than 0')
assert.throws(function () { math.format(1, { notation: 'hex', wordSize: 8.5 }) }, 'Error: size must be an integer')
})
})
describe('bignumber', function () {
const bigmath = math.create({ precision: 20 }) // ensure the precision is 20 digits
it('should format big numbers', function () {
assert.strictEqual(math.format(bigmath.bignumber(2).dividedBy(7)), '0.28571428571428571429')
assert.strictEqual(math.format(bigmath.bignumber(0.10400)), '0.104')
assert.strictEqual(math.format(bigmath.bignumber(2.3)), '2.3')
assert.strictEqual(math.format(bigmath.bignumber(2.3e6)), '2.3e+6')
})
it('should format big numbers with given precision', function () {
const oneThird = bigmath.bignumber(1).div(3)
assert.strictEqual(bigmath.format(oneThird), '0.33333333333333333333') // 20 digits
assert.strictEqual(bigmath.format(oneThird, 3), '0.333')
assert.strictEqual(bigmath.format(oneThird, 4), '0.3333')
assert.strictEqual(bigmath.format(oneThird, 5), '0.33333')
assert.strictEqual(bigmath.format(oneThird, 18), '0.333333333333333333')
})
it('should format big numbers with fixed precision', function () {
const oneThird = math.bignumber(1).div(3)
const twoThirds = math.bignumber(2).div(3)
assert.strictEqual(math.format(oneThird, { notation: 'fixed', precision: 10 }), '0.3333333333')
assert.strictEqual(math.format(oneThird.mul(-1), { notation: 'fixed', precision: 10 }), '-0.3333333333')
assert.strictEqual(math.format(twoThirds, { notation: 'fixed', precision: 10 }), '0.6666666667')
assert.strictEqual(math.format(twoThirds, { notation: 'fixed', precision: 20 }), '0.66666666666666666667')
assert.strictEqual(math.format(oneThird, { notation: 'fixed', precision: 20 }), '0.33333333333333333333')
assert.strictEqual(math.format(oneThird, { notation: 'fixed', precision: 0 }), '0')
assert.strictEqual(math.format(twoThirds, { notation: 'fixed', precision: 0 }), '1')
assert.strictEqual(math.format(math.bignumber('123456789.123456789'), { notation: 'fixed', precision: 5 }), '123456789.12346')
})
describe('engineering notation', function () {
const bignumber = math.bignumber
it('should format positive single digit to engineering notation', function () {
assert.strictEqual(math.format(bignumber(3), { notation: 'engineering' }), '3e+0')
})
it('should format positive two digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(30), { notation: 'engineering' }), '30e+0')
})
it('should format positive three digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(300), { notation: 'engineering' }), '300e+0')
assert.strictEqual(math.format(bignumber(320), { notation: 'engineering' }), '320e+0')
})
it('should format positive four digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(3000), { notation: 'engineering' }), '3e+3')
})
it('should format positive uneven four digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(3001), { notation: 'engineering' }), '3.001e+3')
})
it('should format a number without trailing zeros to engineering notation', function () {
assert.strictEqual(math.format(bignumber(3010), { notation: 'engineering' }), '3.01e+3')
assert.strictEqual(math.format(bignumber(452550000), { notation: 'engineering' }), '452.55e+6')
})
it('should format positive uneven ten digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(3741293481), { notation: 'engineering' }), '3.741293481e+9')
})
it('should format negative uneven ten digits to engineering notation', function () {
assert.strictEqual(math.format(bignumber(-3741293481), { notation: 'engineering' }), '-3.741293481e+9')
})
it('should format positive single digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(bignumber(0.1), { notation: 'engineering' }), '100e-3')
assert.strictEqual(math.format(bignumber(0.11), { notation: 'engineering' }), '110e-3')
})
it('should format positive two digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(bignumber(0.01), { notation: 'engineering' }), '10e-3')
assert.strictEqual(math.format(bignumber(0.011), { notation: 'engineering' }), '11e-3')
assert.strictEqual(math.format(bignumber(0.0111), { notation: 'engineering' }), '11.1e-3')
})
it('should format positive three digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(bignumber(0.003), { notation: 'engineering' }), '3e-3')
})
it('should format positive repeating three digit floating point numbers to engineering notation with precision', function () {
assert.strictEqual(math.format(bignumber(1).div(3), { precision: 3, notation: 'engineering' }), '333e-3')
})
it('should format positive seven digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(bignumber(0.1234567), { notation: 'engineering' }), '123.4567e-3')
})
it('should format negative single digit floating point numbers to engineering notation', function () {
assert.strictEqual(math.format(bignumber(-0.1), { notation: 'engineering' }), '-100e-3')
})
it('should format positive floating point number to engineering notation', function () {
assert.strictEqual(math.format(bignumber('13308.0333333333'), { precision: 11, notation: 'engineering' }), '13.308033333e+3')
})
it('should add or remove zeroes if necessary to output precision sig figs', function () {
assert.strictEqual(math.format(bignumber(12400), { notation: 'engineering', precision: 2 }), '12e+3')
assert.strictEqual(math.format(bignumber(12400), { notation: 'engineering', precision: 3 }), '12.4e+3')
assert.strictEqual(math.format(bignumber(124000), { notation: 'engineering', precision: 3 }), '124e+3')
assert.strictEqual(math.format(bignumber(124000), { notation: 'engineering', precision: 4 }), '124.0e+3')
assert.strictEqual(math.format(bignumber(12400), { notation: 'engineering', precision: 7 }), '12.40000e+3')
assert.strictEqual(math.format(bignumber(12400), { notation: 'engineering', precision: 8 }), '12.400000e+3')
assert.strictEqual(math.format(bignumber(12400), { notation: 'engineering', precision: 9 }), '12.4000000e+3')
assert.strictEqual(math.format(bignumber(-12400), { notation: 'engineering', precision: 7 }), '-12.40000e+3')
assert.strictEqual(math.format(bignumber(0.0124), { notation: 'engineering', precision: 7 }), '12.40000e-3')
assert.strictEqual(math.format(bignumber(0.00124), { notation: 'engineering', precision: 7 }), '1.240000e-3')
assert.strictEqual(math.format(bignumber(0.000124), { notation: 'engineering', precision: 7 }), '124.0000e-6')
assert.strictEqual(math.format(bignumber(0.000124), { notation: 'engineering', precision: 4 }), '124.0e-6')
assert.strictEqual(math.format(bignumber(0.000124), { notation: 'engineering', precision: 3 }), '124e-6')
assert.strictEqual(math.format(bignumber(1.24), { notation: 'engineering', precision: 3 }), '1.24e+0')
// less significant figures than precision, need to add zeros
assert.strictEqual(math.format(bignumber(-1e12), { notation: 'engineering', precision: 3 }), '-1.00e+12')
assert.strictEqual(math.format(bignumber(-1e11), { notation: 'engineering', precision: 3 }), '-100e+9')
assert.strictEqual(math.format(bignumber(-1e10), { notation: 'engineering', precision: 3 }), '-10.0e+9')
assert.strictEqual(math.format(bignumber(-1e9), { notation: 'engineering', precision: 3 }), '-1.00e+9')
assert.strictEqual(math.format(bignumber(1e12), { notation: 'engineering', precision: 3 }), '1.00e+12')
assert.strictEqual(math.format(bignumber(1e11), { notation: 'engineering', precision: 3 }), '100e+9')
assert.strictEqual(math.format(bignumber(1e10), { notation: 'engineering', precision: 3 }), '10.0e+9')
assert.strictEqual(math.format(bignumber(1e9), { notation: 'engineering', precision: 3 }), '1.00e+9')
assert.strictEqual(math.format(bignumber(1e12), { notation: 'engineering', precision: 2 }), '1.0e+12')
assert.strictEqual(math.format(bignumber(1e11), { notation: 'engineering', precision: 2 }), '100e+9')
assert.strictEqual(math.format(bignumber(1e10), { notation: 'engineering', precision: 2 }), '10e+9')
assert.strictEqual(math.format(bignumber(1e9), { notation: 'engineering', precision: 2 }), '1.0e+9')
assert.strictEqual(math.format(bignumber(1e12), { notation: 'engineering', precision: 1 }), '1e+12')
assert.strictEqual(math.format(bignumber(1e11), { notation: 'engineering', precision: 1 }), '100e+9')
assert.strictEqual(math.format(bignumber(1e10), { notation: 'engineering', precision: 1 }), '10e+9')
assert.strictEqual(math.format(bignumber(1e9), { notation: 'engineering', precision: 1 }), '1e+9')
assert.strictEqual(math.format(bignumber(10e3), { notation: 'engineering', precision: 2 }), '10e+3')
assert.strictEqual(math.format(bignumber(10e3), { notation: 'engineering', precision: 1 }), '10e+3')
assert.strictEqual(math.format(bignumber(100e3), { notation: 'engineering', precision: 2 }), '100e+3')
assert.strictEqual(math.format(bignumber(100e3), { notation: 'engineering', precision: 1 }), '100e+3')
assert.strictEqual(math.format(bignumber(100), { notation: 'engineering', precision: 2 }), '100e+0')
assert.strictEqual(math.format(bignumber(10), { notation: 'engineering', precision: 2 }), '10e+0')
assert.strictEqual(math.format(bignumber(10), { notation: 'engineering', precision: 1 }), '10e+0')
assert.strictEqual(math.format(bignumber(1), { notation: 'engineering', precision: 2 }), '1.0e+0')
assert.strictEqual(math.format(bignumber(10e-3), { notation: 'engineering', precision: 2 }), '10e-3')
assert.strictEqual(math.format(bignumber(100e-3), { notation: 'engineering', precision: 2 }), '100e-3')
assert.strictEqual(math.format(bignumber(100e-3), { notation: 'engineering', precision: 1 }), '100e-3')
assert.strictEqual(math.format(bignumber(1e-3), { notation: 'engineering', precision: 1 }), '1e-3')
assert.strictEqual(math.format(bignumber(1e-4), { notation: 'engineering', precision: 1 }), '100e-6')
assert.strictEqual(math.format(bignumber(1e-5), { notation: 'engineering', precision: 1 }), '10e-6')
assert.strictEqual(math.format(bignumber(1e-6), { notation: 'engineering', precision: 1 }), '1e-6')
assert.strictEqual(math.format(bignumber(1e-3), { notation: 'engineering', precision: 3 }), '1.00e-3')
assert.strictEqual(math.format(bignumber(1e-4), { notation: 'engineering', precision: 3 }), '100e-6')
assert.strictEqual(math.format(bignumber(1e-5), { notation: 'engineering', precision: 3 }), '10.0e-6')
assert.strictEqual(math.format(bignumber(1e-6), { notation: 'engineering', precision: 3 }), '1.00e-6')
assert.strictEqual(math.format(bignumber(-1e-3), { notation: 'engineering', precision: 3 }), '-1.00e-3')
assert.strictEqual(math.format(bignumber(-1e-4), { notation: 'engineering', precision: 3 }), '-100e-6')
assert.strictEqual(math.format(bignumber(-1e-5), { notation: 'engineering', precision: 3 }), '-10.0e-6')
assert.strictEqual(math.format(bignumber(-1e-6), { notation: 'engineering', precision: 3 }), '-1.00e-6')
assert.strictEqual(math.format(bignumber('12345600000000'), { notation: 'engineering', precision: 3 }), '12.3e+12')
assert.strictEqual(math.format(bignumber('12345600000000'), { notation: 'engineering', precision: 16 }), '12.34560000000000e+12')
assert.strictEqual(math.format(bignumber('12345678901234.56789'), { notation: 'engineering', precision: 3 }), '12.3e+12')
assert.strictEqual(math.format(bignumber('12345678901234.56789'), { notation: 'engineering', precision: 16 }), '12.34567890123457e+12')
assert.strictEqual(math.format(bignumber('0.000000000000123456'), { notation: 'engineering', precision: 3 }), '123e-15')
assert.strictEqual(math.format(bignumber('0.000000000000123456'), { notation: 'engineering', precision: 16 }), '123.4560000000000e-15')
assert.strictEqual(math.format(bignumber('0.0000000000001234567890123456789'), { notation: 'engineering', precision: 3 }), '123e-15')
assert.strictEqual(math.format(bignumber('0.0000000000001234567890123456789'), { notation: 'engineering', precision: 16 }), '123.4567890123457e-15')
})
it('should format numbers starting with more than 3 sig figs that target 1 or 2 sig figs', function () {
assert.strictEqual(math.format(bignumber(0.333333333333333), { notation: 'engineering', precision: 1 }), '300e-3')
assert.strictEqual(math.format(bignumber(0.333333333333333), { notation: 'engineering', precision: 2 }), '330e-3')
assert.strictEqual(math.format(bignumber(33.33333333333), { notation: 'engineering', precision: 1 }), '30e+0')
assert.strictEqual(math.format(bignumber(333.33333333333), { notation: 'engineering', precision: 2 }), '330e+0')
assert.strictEqual(math.format(bignumber(333333.333333333), { notation: 'engineering', precision: 1 }), '300e+3')
assert.strictEqual(math.format(bignumber(777777.77777777), { notation: 'engineering', precision: 1 }), '800e+3')
assert.strictEqual(math.format(bignumber(777777.77777777), { notation: 'engineering', precision: 2 }), '780e+3')
assert.strictEqual(math.format(bignumber(-0.000000000777777), { notation: 'engineering', precision: 2 }), '-780e-12')
})
})
describe('non decimal base formatting', function () {
it('should format in binary, octal, and hexadecimal', function () {
assert.strictEqual(math.format(math.bignumber(128), { notation: 'bin' }), '0b10000000')
assert.strictEqual(math.format(math.bignumber(128), { notation: 'oct' }), '0o200')
assert.strictEqual(math.format(math.bignumber(128), { notation: 'hex' }), '0x80')
assert.strictEqual(math.format(math.bignumber(-128), { notation: 'hex' }), '-0x80')
assert.strictEqual(math.format(math.bignumber(-128), { notation: 'hex', wordSize: 8 }), '0x80i8')
assert.strictEqual(math.format(math.bignumber(127), { notation: 'hex', wordSize: 8 }), '0x7fi8')
assert.strictEqual(math.format(math.bignumber(1.25), { notation: 'bin' }), '0b1.01')
assert.strictEqual(math.format(math.bignumber(1.25), { notation: 'oct' }), '0o1.2')
assert.strictEqual(math.format(math.bignumber(1.25), { notation: 'hex' }), '0x1.4')
})
it('should throw an error for invalid values', function () {
assert.throws(function () { math.format(math.bignumber(1.25), { notation: 'hex', wordSize: 8 }) }, 'Error: Value must be an integer')
assert.throws(function () { math.format(math.bignumber(1), { notation: 'hex', wordSize: -8 }) }, 'Error: size must be greater than 0')
assert.throws(function () { math.format(math.bignumber(1), { notation: 'hex', wordSize: 8.5 }) }, 'Error: size must be an integer')
})
})
})
it('should format expressions', function () {
assert.strictEqual(math.format(math.parse('0.3333'), { precision: 1 }), '0.3')
assert.strictEqual(math.format(math.parse('0.3333 + [0.4444]'), { precision: 1 }), '0.3 + [0.4]')
const bigmath = math.create({ number: 'BigNumber' })
assert.strictEqual(bigmath.format(bigmath.parse('0.3333 + [0.4444]'), { precision: 1 }), '0.3 + [0.4]')
})
it('should throw an error on wrong number of arguments', function () {
assert.throws(function () { math.format() }, /TypeError: Too few arguments/)
assert.throws(function () { math.format(1, 2, 3) }, /TypeError: Too many arguments/)
})
it('should LaTeX format', function () {
const expression = math.parse('format(1)')
assert.strictEqual(expression.toTex(), '\\mathrm{format}\\left(1\\right)')
})
})