[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*.log\nnode_modules\nlib\ncoverage\nlogs\nbuild-test\n.rpt2_cache\nbuild/\n.nyc_output/"
  },
  {
    "path": ".npmignore",
    "content": ".DS_Store\n*.log\nexamples\ntest\ncoverage\n"
  },
  {
    "path": ".travis.yml",
    "content": "dist: trusty\nlanguage: node_js\nnode_js:\n  - 8\nscript:\n  - npm test\naddons:\n  firefox: \"49.0\"\nbefore_script:\n  - export DISPLAY=:99.0\n  - sh -e /etc/init.d/xvfb start\n"
  },
  {
    "path": "README.md",
    "content": "# number-precision [![npm version](https://badge.fury.io/js/number-precision.svg)](http://badge.fury.io/js/number-precision) [![Build Status](https://travis-ci.org/nefe/number-precision.svg)](https://travis-ci.org/nefe/number-precision) [![codecov](https://codecov.io/gh/nefe/number-precision/branch/master/graph/badge.svg)](https://codecov.io/gh/nefe/number-precision)\n\nPerform addition, subtraction, multiplication and division operations precisely using javascript\n\n### Why\n\n```js\n0.1 + 0.2 = 0.30000000000000004\n1.0 - 0.9 = 0.09999999999999998\n0.105.toFixed(2) = 0.1 // not 0.11\n```\n\n### Install\n\n```\nnpm install number-precision --save\n```\n\n### Methods\n\n```js\nNP.strip(num)         // strip a number to nearest right number\nNP.plus(num1, num2, num3, ...)   // addition, num + num2 + num3, two numbers is required at least.\nNP.minus(num1, num2, num3, ...)  // subtraction, num1 - num2 - num3\nNP.times(num1, num2, num3, ...)  // multiplication, num1 * num2 * num3\nNP.divide(num1, num2, num3, ...) // division, num1 / num2 / num3\nNP.round(num, ratio)  // round a number based on ratio\n```\n\n### Usage\n\n```js\nimport NP from 'number-precision'\nNP.strip(0.09999999999999998); // = 0.1\nNP.plus(0.1, 0.2);             // = 0.3, not 0.30000000000000004\nNP.plus(2.3, 2.4);             // = 4.7, not 4.699999999999999\nNP.minus(1.0, 0.9);            // = 0.1, not 0.09999999999999998\nNP.times(3, 0.3);              // = 0.9, not 0.8999999999999999\nNP.times(0.362, 100);          // = 36.2, not 36.199999999999996\nNP.divide(1.21, 1.1);          // = 1.1, not 1.0999999999999999\nNP.round(0.105, 2);            // = 0.11, not 0.1\n```\n\nPS: If you want to get rid of `XXX is beyond boundary when transfer to integer, the results may not be accurate`, use this at the beginning of your app to turn off boundary checking.\n```js\nNP.enableBoundaryChecking(false); // default param is true\n```\n\n### License\nMIT\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"number-precision\",\n  \"version\": \"1.6.0\",\n  \"description\": \"Perform addition, subtraction, multiplication and division operations precisely using javascript\",\n  \"main\": \"build/index.js\",\n  \"module\": \"build/index.es.js\",\n  \"types\": \"build/index.d.ts\",\n  \"author\": \"cam song\",\n  \"keywords\": [\n    \"number precision\",\n    \"floating problem\",\n    \"rounding error\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/nefe/number-precision.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/nefe/number-precision/issues\"\n  },\n  \"homepage\": \"https://github.com/nefe/number-precision\",\n  \"scripts\": {\n    \"build\": \"rollup -c\",\n    \"watch\": \"rollup -cw\",\n    \"test\": \"tsc -p tsconfig.test.json && nyc --reporter=lcov --reporter=text --reporter=json ava && rm -rf .nyc_output\",\n    \"posttest\": \"codecov -f coverage/*.json -t 072762c4-c5bc-4393-bcd9-71eac9e7725b\",\n    \"prepublish\": \"rm -rf build && tsc && npm run build\",\n    \"tslint\": \"tslint ./src/**/*.ts --fix\"\n  },\n  \"ava\": {\n    \"files\": [\n      \"build-test/**/*.test.js\"\n    ]\n  },\n  \"pre-commit\": [\n    \"tslint\"\n  ],\n  \"devDependencies\": {\n    \"ava\": \"^3.8.2\",\n    \"braces\": \">=2.3.1\",\n    \"codecov\": \"^3.1.0\",\n    \"nyc\": \"^15.0.1\",\n    \"pre-commit\": \"^1.2.2\",\n    \"rollup\": \"^0.52.2\",\n    \"rollup-plugin-typescript\": \"^0.8.1\",\n    \"rollup-plugin-typescript2\": \"^0.8.4\",\n    \"rollup-watch\": \"^4.3.1\",\n    \"tslint\": \"^5.8.0\",\n    \"typescript\": \"^3.8.3\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import typescript from 'rollup-plugin-typescript2'\n\nexport default {\n  input: './src/index.ts',\n  output: [\n    {\n      format: 'iife',\n      name: 'NP',\n      dest: './build/index.iife.js'\n    },\n    {\n      format: 'umd',\n      name: 'NP',\n      dest: './build/index.umd.js'\n    },\n    {\n      format: 'cjs',\n      dest: './build/index.js'\n    },\n    {\n      format: 'es',\n      dest: './build/index.es.js'\n    }\n  ],\n  plugins: [typescript({cacheRoot: `${require('temp-dir')}/.rpt2_cache`})]\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "/**\n * @desc 解决浮动运算问题，避免小数点后产生多位数和计算精度损失。\n *\n * 问题示例：2.3 + 2.4 = 4.699999999999999，1.0 - 0.9 = 0.09999999999999998\n */\n\ntype NumberType = number | string;\n\n/**\n * Correct the given number to specifying significant digits.\n *\n * @param num The input number\n * @param precision An integer specifying the number of significant digits\n *\n * @example strip(0.09999999999999998) === 0.1 // true\n */\nfunction strip(num: NumberType, precision = 15): number {\n  return +parseFloat(Number(num).toPrecision(precision));\n}\n\n/**\n * Return digits length of a number.\n *\n * @param num The input number\n */\nfunction digitLength(num: NumberType): number {\n  // Get digit length of e\n  const eSplit = num.toString().split(/[eE]/);\n  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n  return len > 0 ? len : 0;\n}\n\n/**\n * Convert the given number to integer, support scientific notation.\n * The number will be scale up if it is decimal.\n *\n * @param num The input number\n */\nfunction float2Fixed(num: NumberType): number {\n  if (num.toString().indexOf('e') === -1) {\n    return Number(num.toString().replace('.', ''));\n  }\n  const dLen = digitLength(num);\n  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);\n}\n\n/**\n * Log a warning if the given number is out of bounds.\n *\n * @param num The input number\n */\nfunction checkBoundary(num: number) {\n  if (_boundaryCheckingState) {\n    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {\n      console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`);\n    }\n  }\n}\n\n/**\n * Create an operation to support rest params.\n *\n * @param operation The original operation\n */\nfunction createOperation(operation: (n1: NumberType, n2: NumberType) => number): (...nums: NumberType[]) => number {\n  return (...nums: NumberType[]) => {\n    const [first, ...others] = nums;\n    return others.reduce((prev, next) => operation(prev || 0, next || 0), first) as number;\n  };\n}\n\n/**\n * Accurate multiplication.\n *\n * @param nums The numbers to multiply\n */\nconst times = createOperation((num1, num2) => {\n  const num1Changed = float2Fixed(num1);\n  const num2Changed = float2Fixed(num2);\n  const baseNum = digitLength(num1) + digitLength(num2);\n  const leftValue = num1Changed * num2Changed;\n\n  checkBoundary(leftValue);\n\n  return leftValue / Math.pow(10, baseNum);\n});\n\n/**\n * Accurate addition.\n *\n * @param nums The numbers to add\n */\nconst plus = createOperation((num1, num2) => {\n  // 取最大的小数位\n  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n  // 把小数都转为整数然后再计算\n  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\n});\n\n/**\n * Accurate subtraction.\n *\n * @param nums The numbers to subtract\n */\nconst minus = createOperation((num1, num2) => {\n  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\n  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\n});\n\n/**\n * Accurate division.\n *\n * @param nums The numbers to divide\n */\nconst divide = createOperation((num1, num2) => {\n  const num1Changed = float2Fixed(num1);\n  const num2Changed = float2Fixed(num2);\n\n  checkBoundary(num1Changed);\n  checkBoundary(num2Changed);\n\n  // fix: 类似 10 ** -4 为 0.00009999999999999999，strip 修正\n  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\n});\n\n/**\n * Accurate rounding method.\n *\n * @param num The number to round\n * @param decimal An integer specifying the decimal digits\n */\nfunction round(num: NumberType, decimal: number): number {\n  const base = Math.pow(10, decimal);\n  let result = divide(Math.round(Math.abs(times(num, base))), base);\n\n  if (num < 0 && result !== 0) {\n    result = times(result, -1);\n  }\n\n  return result;\n}\n\nlet _boundaryCheckingState = true;\n\n/**\n * Whether to check the bounds of number, default is enabled.\n *\n * @param flag The value to indicate whether is enabled\n */\nfunction enableBoundaryChecking(flag = true) {\n  _boundaryCheckingState = flag;\n}\n\nexport { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };\n\nexport default {\n  strip,\n  plus,\n  minus,\n  times,\n  divide,\n  round,\n  digitLength,\n  float2Fixed,\n  enableBoundaryChecking,\n};\n"
  },
  {
    "path": "test/index.test.ts",
    "content": "import test from 'ava';\nimport NP from '../src/index';\n\ntest('NP.strip can eliminate rounding errors', (t) => {\n  t.true(NP.strip(0.09999999999999998) === 0.1);\n  t.true(NP.strip(1.0000000000000001) === 1);\n  t.true(NP.strip('0.09999999999999998') === 0.1);\n  t.true(NP.strip('1.0000000000000001') === 1);\n});\n\ntest('NP.digitLength can do digitLength operation', (t) => {\n  t.true(NP.digitLength(123.4567890123) === 10);\n\n  t.true(NP.digitLength(1.23e-5) === 7);\n  t.true(NP.digitLength(1.23E-5) === 7);\n  t.true(NP.digitLength(1.233467e-5) === 11);\n  t.true(NP.digitLength(123.45e-5) === 7);\n  t.true(NP.digitLength(1.23e-10) === 12);\n  t.true(NP.digitLength(1.23e1) === 1);\n  t.true(NP.digitLength(1e20) === 0);\n  t.true(NP.digitLength(1.12345e20) === 0);\n  t.true(NP.digitLength(1.123e30) === 0);\n  t.true(NP.digitLength(1.123e-100) === 103);\n  t.true(NP.digitLength('1.23e-5') === 7);\n  t.true(NP.digitLength('1.23E-5') === 7);\n  t.true(NP.digitLength('1.233467e-5') === 11);\n  t.true(NP.digitLength('123.45e-5') === 7);\n  t.true(NP.digitLength('1.23e-10') === 12);\n  t.true(NP.digitLength('1.23e1') === 1);\n  t.true(NP.digitLength('1e20') === 0);\n  t.true(NP.digitLength('1.12345e20') === 0);\n  t.true(NP.digitLength('1.123e30') === 0);\n  t.true(NP.digitLength('1.123e-100') === 103);\n});\n\ntest('NP.float2Fixed can change float to fixed', (t) => {\n  t.true(NP.float2Fixed(1e-1) === 1);\n  t.true(NP.float2Fixed(1e-6) === 1);\n  t.true(NP.float2Fixed(1e-7) === 1);\n  t.true(NP.float2Fixed(1e-13) === 1);\n  t.true(NP.float2Fixed(1.123e30) === 1.123e30);\n  t.true(NP.float2Fixed(1.6e-30) === 16);\n  t.true(NP.float2Fixed(1.234567e-13) === 1234567);\n  t.true(NP.float2Fixed(1.2345678912345e10) === 12345678912345);\n  t.true(NP.float2Fixed(0.000000123456) === 123456);\n  t.true(NP.float2Fixed(1.23456e-7) === 123456);\n  t.true(NP.float2Fixed('1e-1') === 1);\n  t.true(NP.float2Fixed('1e-6') === 1);\n  t.true(NP.float2Fixed('1e-7') === 1);\n  t.true(NP.float2Fixed('1e-13') === 1);\n  t.true(NP.float2Fixed('1.123e30') === 1.123e30);\n  t.true(NP.float2Fixed('1.6e-30') === 16);\n  t.true(NP.float2Fixed('1.234567e-13') === 1234567);\n  t.true(NP.float2Fixed('1.2345678912345e10') === 12345678912345);\n  t.true(NP.float2Fixed('0.000000123456') === 123456);\n  t.true(NP.float2Fixed('1.23456e-7') === 123456);\n});\n\ntest('NP.plus can do plus operation', (t) => {\n  t.true(NP.plus(0.1, 0.2) === 0.3);\n  t.true(NP.plus(2.3, 2.4) === 4.7);\n  t.true(NP.plus(-1.6, -1) === -2.6);\n  t.true(NP.plus(-2.0, 63) === 61);\n  t.true(NP.plus(-3, 7) === 4);\n  t.true(NP.plus(-221, 38) === -183);\n  t.true(NP.plus(-1, 0) === -1);\n  t.true(NP.plus(2.018, 0.001) === 2.019);\n  t.true(NP.plus(1.3224e10, 1.3224e3) === 13224001322.4);\n  t.true(NP.plus(1.6e-30, 1.6e-30) === 3.2e-30);\n  t.true(NP.plus('0.1', '0.2') === 0.3);\n  t.true(NP.plus('2.3', '2.4') === 4.7);\n  t.true(NP.plus('-1.6', '-1') === -2.6);\n  t.true(NP.plus('-2.0', '63') === 61);\n  t.true(NP.plus('-3', '7') === 4);\n  t.true(NP.plus('-221', '38') === -183);\n  t.true(NP.plus('-1', '0') === -1);\n  t.true(NP.plus('-1', '0', '2', '3', 4) === 8);\n  t.true(NP.plus('2.018', '0.001') === 2.019);\n  t.true(NP.plus('1.3224e10', '1.3224e3') === 13224001322.4);\n  t.true(NP.plus('1.6e-30', '1.6e-30') === 3.2e-30);\n\n  t.true(NP.plus(0.1, 0.2, 0.3) === 0.6);\n  t.true(NP.plus('0.1', '0.2', '0.3') === 0.6);\n\n  t.true(NP.plus(...new Array(500).fill(1)) === 500);\n});\n\ntest('NP.minus can do minus operation', (t) => {\n  t.true(NP.minus(0.07, 0.01) === 0.06);\n  t.true(NP.minus(0.7, 0.1) === 0.6);\n  t.true(NP.minus(1.0, 0.9) === 0.1);\n  t.true(NP.minus(1, 0) === 1);\n  t.true(NP.minus(1, -0) === 1);\n  t.true(NP.minus(-1, 0) === -1);\n  t.true(NP.minus(-1, -0) === -1);\n  t.true(NP.minus(1, 22) === -21);\n  t.true(NP.minus(8893568.397103781249, -7.29674059550) === 8893575.693844376749);\n  t.true(NP.minus(105468873, 0) === 105468873);\n  t.true(NP.minus('0.07', '0.01') === 0.06);\n  t.true(NP.minus('0.7', '0.1') === 0.6);\n  t.true(NP.minus('1.0', '0.9') === 0.1);\n  t.true(NP.minus('1', '0') === 1);\n  t.true(NP.minus('1', '-0') === 1);\n  t.true(NP.minus('-1', '0') === -1);\n  t.true(NP.minus('-1', '-0') === -1);\n  t.true(NP.minus('1', '22') === -21);\n  t.true(NP.minus('8893568.397103781249', '-7.29674059550') === 8893575.693844376749);\n  t.true(NP.minus('105468873', '0') === 105468873);\n\n  t.true(NP.minus(1.23e5, 10) === 122990);\n  t.true(NP.minus(1.23e-5, 1.0023) === -1.0022877);\n  t.true(NP.minus(1.3224e10, 21) === 13223999979);\n  t.true(NP.minus(1.3224e10, 1.3224e3) === 13223998677.6);\n  t.true(NP.minus(1.7e-30, 0.1e-30) === 1.6e-30);\n  t.true(NP.minus('1.23e5', '10') === 122990);\n  t.true(NP.minus('1.23e-5', '1.0023') === -1.0022877);\n  t.true(NP.minus('1.3224e10', '21') === 13223999979);\n  t.true(NP.minus('1.3224e10', '1.3224e3') === 13223998677.6);\n  t.true(NP.minus('1.7e-30', '0.1e-30') === 1.6e-30);\n\n  t.true(NP.minus(6, 3, 2) === 1);\n  t.true(NP.minus(6, 3, 2, 1, 2, 3) === -5);\n  t.true(NP.minus('6', '3', '2') === 1);\n  t.true(NP.minus('6', '3', '2', '1', '2', '3') === -5);\n\n  t.true(NP.minus(500, ...new Array(500).fill(1)) === 0);\n});\n\ntest('NP.times can do times operation', (t) => {\n  t.true(NP.times(0.07, 100) === 7);\n  t.true(NP.times(0.7, 0.1) === 0.07);\n  t.true(NP.times(3, 0.3) === 0.9);\n  t.true(NP.times(118762317358.75, 1e-8) === 1187.6231735875);\n  t.true(NP.times(0.362, 100) === 36.2);\n  t.true(NP.times(1.1, 1.1) === 1.21);\n  t.true(NP.times(2.018, 1000) === 2018);\n  t.true(NP.times(5.2, -3.8461538461538462) === -20);\n  t.true(NP.times(1.22, -1.639344262295082) === -2);\n  t.true(NP.times(2.5, -0.92) === -2.3);\n  t.true(NP.times(-2.2, 0.6363636363636364) === -1.4);\n  t.true(NP.times('0.07', '100') === 7);\n  t.true(NP.times('0.7', '0.1') === 0.07);\n  t.true(NP.times('3', '0.3') === 0.9);\n  t.true(NP.times('118762317358.75', '1e-8') === 1187.6231735875);\n  t.true(NP.times('0.362', '100') === 36.2);\n  t.true(NP.times('1.1', '1.1') === 1.21);\n  t.true(NP.times('2.018', '1000') === 2018);\n  t.true(NP.times('5.2', '-3.8461538461538462') === -20);\n  t.true(NP.times('1.22', '-1.639344262295082') === -2);\n  t.true(NP.times('2.5', '-0.92') === -2.3);\n  t.true(NP.times('-2.2', '0.6363636363636364') === -1.4);\n  // t.true(NP.times(-3, 2.3333333333333335) === 7);\n  // t.true(NP.times(-0.076, -92.10526315789471) === 7);\n  t.true(NP.times(8.0, -0.3625) === -2.9);\n  t.true(NP.times(6.6, 0.30303030303030304) === 2);\n  t.true(NP.times(10.0, -0.8) === -8);\n  t.true(NP.times(-1.1, -7.272727272727273) === 8);\n  t.true(NP.times('8.0', '-0.3625') === -2.9);\n  t.true(NP.times('6.6', '0.30303030303030304') === 2);\n  t.true(NP.times('10.0', '-0.8') === -8);\n  t.true(NP.times('-1.1', '-7.272727272727273') === 8);\n\n  t.true(NP.times(-1.23e4, 20) === -246000);\n  t.true(NP.times(1.7e-30, 1.5e20) === 2.55e-10);\n  t.true(NP.times('-1.23e4', '20') === -246000);\n  t.true(NP.times('1.7e-30', '1.5e20') === 2.55e-10);\n\n  t.true(NP.times(2, 2, 3) === 12);\n  t.true(NP.times(2, 2, 3, 0.1) === 1.2);\n  t.true(NP.times('2', '2', '3') === 12);\n  t.true(NP.times('2', '2', '3', '0.1') === 1.2);\n\n  t.true(NP.times(0.000000123456, 0.000000123456) === 1.5241383936e-14);\n  t.true(NP.times(1.23456e-7, 1.23456e-7) === 1.5241383936e-14);\n  t.true(NP.times('0.000000123456', '0.000000123456') === 1.5241383936e-14);\n  t.true(NP.times('1.23456e-7', '1.23456e-7') === 1.5241383936e-14);\n\n  t.true(NP.times(...new Array(500).fill(1)) === 1);\n});\n\ntest('NP.divide can do divide operation', (t) => {\n  t.true(NP.divide(1.21, 1.1) === 1.1);\n  t.true(NP.divide(4750.49269435, 4) === 1187.6231735875);\n  t.true(NP.divide(0.9, 3) === 0.3);\n  t.true(NP.divide(36.2, 0.362) === 100);\n  t.true(NP.divide(-20, 5.2) === -3.8461538461538462);\n  t.true(NP.divide(-2, 1.22) === -1.639344262295082);\n  t.true(NP.divide(-2.3, 2.5) === -0.92);\n  t.true(NP.divide(-1.4, -2.2) === 0.6363636363636364);\n  t.true(NP.divide(7, -3) === -2.3333333333333335);\n  t.true(NP.divide(7, -0.076) === -92.10526315789471);\n  t.true(NP.divide(-2.9, 8.0) === -0.3625);\n  t.true(NP.divide(2, 6.6) === 0.30303030303030304);\n  t.true(NP.divide(-8, 10.0) === -0.8);\n  t.true(NP.divide(8, -1.1) === -7.272727272727273);\n  t.true(NP.divide('1.21', '1.1') === 1.1);\n  t.true(NP.divide('4750.49269435', '4') === 1187.6231735875);\n  t.true(NP.divide('0.9', '3') === 0.3);\n  t.true(NP.divide('36.2', '0.362') === 100);\n  t.true(NP.divide('-20', '5.2') === -3.8461538461538462);\n  t.true(NP.divide('-2', '1.22') === -1.639344262295082);\n  t.true(NP.divide('-2.3', '2.5') === -0.92);\n  t.true(NP.divide('-1.4', '-2.2') === 0.6363636363636364);\n  t.true(NP.divide('7', '-3') === -2.3333333333333335);\n  t.true(NP.divide('7', '-0.076') === -92.10526315789471);\n  t.true(NP.divide('-2.9', '8.0') === -0.3625);\n  t.true(NP.divide('2', '6.6') === 0.30303030303030304);\n  t.true(NP.divide('-8', '10.0') === -0.8);\n  t.true(NP.divide('8', '-1.1') === -7.272727272727273);\n\n  t.true(NP.divide(-1.23e4, 20) === -615);\n  t.true(NP.divide(2.55e-10, 1.7e-30) === 1.5e20);\n  t.true(NP.divide('-1.23e4', '20') === -615);\n  t.true(NP.divide('2.55e-10', '1.7e-30') === 1.5e20);\n\n  t.true(NP.divide(12, 3, 2) === 2);\n  t.true(NP.divide(33.3333, 100) === 0.333333);\n  t.true(NP.divide(83.42894732749, 100) === 0.8342894732749);\n  t.true(NP.divide(1, 3) === 0.3333333333333333);\n  t.true(NP.divide('12', '3', '2') === 2);\n  t.true(NP.divide('33.3333', '100') === 0.333333);\n  t.true(NP.divide('83.42894732749', '100') === 0.8342894732749);\n  t.true(NP.divide('1', '3') === 0.3333333333333333);\n\n  t.true(NP.divide(...new Array(500).fill(1)) === 1);\n  t.true(NP.divide(1024, 4, 8, 2) === 16);\n});\n\ntest('NP.round can do round operation', (t) => {\n  t.true(NP.round(0, 1) === 0);\n  t.true(NP.round(0, 0) === 0);\n  t.true(NP.round(0.7875, 3) === 0.788);\n  t.true(NP.round(0.105, 2) === 0.11);\n  t.true(NP.round(1, 1) === 1);\n  t.true(NP.round(0.1049999999, 2) === 0.1);\n  t.true(NP.round(0.105, 1) === 0.1);\n  t.true(NP.round(1.335, 2) === 1.34);\n  t.true(NP.round(1.35, 1) === 1.4);\n  t.true(NP.round(12345.105, 2) === 12345.11);\n  t.true(NP.round(0.0005, 2) === 0);\n  t.true(NP.round(0.0005, 3) === 0.001);\n  t.true(NP.round('0', 1) === 0);\n  t.true(NP.round('0', 0) === 0);\n  t.true(NP.round('0.7875', 3) === 0.788);\n  t.true(NP.round('0.105', 2) === 0.11);\n  t.true(NP.round('1', 1) === 1);\n  t.true(NP.round('0.1049999999', 2) === 0.1);\n  t.true(NP.round('0.105', 1) === 0.1);\n  t.true(NP.round('1.335', 2) === 1.34);\n  t.true(NP.round('1.35', 1) === 1.4);\n  t.true(NP.round('12345.105', 2) === 12345.11);\n  t.true(NP.round('0.0005', 2) === 0);\n  t.true(NP.round('0.0005', 3) === 0.001);\n\n  t.true(NP.round(1.2345e3, 3) === 1234.5);\n  t.true(NP.round(1.2344e3, 3) === 1234.4);\n  t.true(NP.round(1e3, 1) === 1000);\n  t.true(NP.round('1.2345e3', 3) === 1234.5);\n  t.true(NP.round('1.2344e3', 3) === 1234.4);\n  t.true(NP.round('1e3', 1) === 1000);\n\n  t.true(NP.round('-0.125', 2) === -0.13);\n  t.true(NP.round('-0.001', 2) === 0.00);\n  t.true(NP.round('-0.005', 2) === -0.01);\n  t.true(NP.round('0.125', 2) === 0.13);\n  t.true(NP.round('0.001', 2) === 0.00);\n  t.true(NP.round('0.005', 2) === 0.01);\n  t.true(NP.round(-0.125, 2) === -0.13);\n  t.true(NP.round(-0.001, 2) === 0.00);\n  t.true(NP.round(-0.005, 2) === -0.01);\n  t.true(NP.round(0.125, 2) === 0.13);\n  t.true(NP.round(0.001, 2) === 0.00);\n  t.true(NP.round(0.005, 2) === 0.01);\n});\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"lib\": [\n      \"dom\",\n      \"es5\",\n      \"es6\"\n    ],\n    \"target\": \"es5\",\n    \"outDir\": \"build\",\n    \"sourceMap\": true,\n    \"declaration\": true\n  },\n  \"include\": [\n    \"src/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.test.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"lib\": [\n      \"dom\",\n      \"es5\",\n      \"es6\"\n    ],\n    \"target\": \"es5\",\n    \"outDir\": \"build-test\",\n    \"sourceMap\": true\n  },\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "tslint.json",
    "content": "{\n  \"extends\": [\"tslint:recommended\"],\n  \"rules\": {\n    \"arrow-parens\": false,\n    \"arrow-return-shorthand\": [true],\n    \"import-spacing\": true,\n    \"interface-name\": [false],\n    \"interface-over-type-literal\": false,\n    \"linebreak-style\": [true, \"LF\"],\n    \"max-classes-per-file\": [false],\n    \"member-access\": [false],\n    \"no-require-imports\": true,\n    \"object-literal-sort-keys\": false,\n    \"ordered-imports\": [false],\n    \"no-console\": false,\n    \"prefer-const\": true,\n    \"quotemark\": [true, \"single\", \"jsx-double\"],\n    \"space-before-function-paren\": [true, {\n      \"anonymous\": \"always\",\n      \"asyncArrow\": \"always\",\n      \"constructor\": \"never\",\n      \"method\": \"never\",\n      \"named\": \"never\"\n    }],\n    \"variable-name\": [\n      true,\n      \"ban-keywords\",\n      \"check-format\",\n      \"allow-pascal-case\",\n      \"allow-leading-underscore\"\n    ]\n  }\n}\n"
  }
]