202 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # big.js
 | |
| 
 | |
| **A small, fast JavaScript library for arbitrary-precision decimal arithmetic.**
 | |
| 
 | |
| The little sister to [bignumber.js](https://github.com/MikeMcl/bignumber.js/) and [decimal.js](https://github.com/MikeMcl/decimal.js/). See [here](https://github.com/MikeMcl/big.js/wiki) for some notes on the difference between them.
 | |
| 
 | |
| ## Features
 | |
| 
 | |
|   - Faster, smaller and easier-to-use than JavaScript versions of Java's BigDecimal
 | |
|   - Only 5.9 KB minified and 2.7 KB gzipped
 | |
|   - Simple API
 | |
|   - Replicates the `toExponential`, `toFixed` and `toPrecision` methods of JavaScript's Number type
 | |
|   - Includes a `sqrt` method
 | |
|   - Stores values in an accessible decimal floating point format
 | |
|   - No dependencies
 | |
|   - Comprehensive [documentation](http://mikemcl.github.io/big.js/) and test set
 | |
| 
 | |
| ## Set up
 | |
| 
 | |
| The library is the single JavaScript file *big.js* (or *big.min.js*, which is *big.js* minified).
 | |
| 
 | |
| Browser:
 | |
| 
 | |
| ```html
 | |
| <script src='path/to/big.js'></script>
 | |
| ```
 | |
| 
 | |
| [Node.js](http://nodejs.org):
 | |
| 
 | |
| ```bash
 | |
| $ npm install big.js
 | |
| ```
 | |
| 
 | |
| ```javascript
 | |
| const Big = require('big.js');
 | |
| ```
 | |
| 
 | |
| ES6 module:
 | |
| 
 | |
| ```javascript
 | |
| import Big from 'big.mjs';
 | |
| ```
 | |
| ## Use
 | |
| 
 | |
| *In all examples below, `var`, semicolons and `toString` calls are not shown. If a commented-out value is in quotes it means `toString` has been called on the preceding expression.*
 | |
| 
 | |
| The library exports a single function, `Big`, the constructor of Big number instances.
 | |
| It accepts a value of type number, string or Big number object.
 | |
| 
 | |
|     x = new Big(123.4567)
 | |
|     y = Big('123456.7e-3')             // 'new' is optional
 | |
|     z = new Big(x)
 | |
|     x.eq(y) && x.eq(z) && y.eq(z)      // true
 | |
| 
 | |
| A Big number is immutable in the sense that it is not changed by its methods.
 | |
| 
 | |
|     0.3 - 0.1                          // 0.19999999999999998
 | |
|     x = new Big(0.3)
 | |
|     x.minus(0.1)                       // "0.2"
 | |
|     x                                  // "0.3"
 | |
| 
 | |
| The methods that return a Big number can be chained.
 | |
| 
 | |
|     x.div(y).plus(z).times(9).minus('1.234567801234567e+8').plus(976.54321).div('2598.11772')
 | |
|     x.sqrt().div(y).pow(3).gt(y.mod(z))    // true
 | |
| 
 | |
| Like JavaScript's Number type, there are `toExponential`, `toFixed` and `toPrecision` methods.
 | |
| 
 | |
|     x = new Big(255.5)
 | |
|     x.toExponential(5)                 // "2.55500e+2"
 | |
|     x.toFixed(5)                       // "255.50000"
 | |
|     x.toPrecision(5)                   // "255.50"
 | |
| 
 | |
| The arithmetic methods always return the exact result except `div`, `sqrt` and `pow`
 | |
| (with negative exponent), as these methods involve division.
 | |
| 
 | |
| The maximum number of decimal places and the rounding mode used to round the results of these methods is determined by the value of the `DP` and `RM` properties of the `Big` number constructor.
 | |
| 
 | |
|     Big.DP = 10
 | |
|     Big.RM = 1
 | |
| 
 | |
|     x = new Big(2);
 | |
|     y = new Big(3);
 | |
|     z = x.div(y)                       // "0.6666666667"
 | |
|     z.sqrt()                           // "0.8164965809"
 | |
|     z.pow(-3)                          // "3.3749999995"
 | |
|     z.times(z)                         // "0.44444444448888888889"
 | |
|     z.times(z).round(10)               // "0.4444444445"
 | |
| 
 | |
| Multiple Big number constructors can be created, each with an independent configuration.
 | |
| 
 | |
| The value of a Big number is stored in a decimal floating point format in terms of a coefficient, exponent and sign.
 | |
| 
 | |
|     x = new Big(-123.456);
 | |
|     x.c                                // [1,2,3,4,5,6]    coefficient (i.e. significand)
 | |
|     x.e                                // 2                exponent
 | |
|     x.s                                // -1               sign
 | |
| 
 | |
| For further information see the [API](http://mikemcl.github.io/big.js/) reference from the *doc* folder.
 | |
| 
 | |
| ## Test
 | |
| 
 | |
| The *test* directory contains the test scripts for each Big number method.
 | |
| 
 | |
| The tests can be run with Node.js or a browser.
 | |
| 
 | |
| To run all the tests
 | |
| 
 | |
|     $ npm test
 | |
| 
 | |
| To test a single method
 | |
| 
 | |
|     $ node test/toFixed
 | |
| 
 | |
| For the browser, see *single-test.html* and *every-test.html* in the *test/browser* directory.
 | |
| 
 | |
| *big-vs-number.html* is a simple application that enables some of the methods of big.js to be compared with those of JavaScript's Number type.
 | |
| 
 | |
| ## Performance
 | |
| 
 | |
| The *perf* directory contains two legacy applications and a *lib* directory containing the BigDecimal libraries used by both.
 | |
| 
 | |
| *big-vs-bigdecimal.html* tests the performance of big.js against the JavaScript translations of two versions of BigDecimal, its use should be more or less self-explanatory.
 | |
| 
 | |
| * [GWT: java.math.BigDecimal](https://github.com/iriscouch/bigdecimal.js)
 | |
| * [ICU4J: com.ibm.icu.math.BigDecimal](https://github.com/dtrebbien/BigDecimal.js)
 | |
| 
 | |
| The BigDecimal in the npm registry is the GWT version. It has some bugs, see the Node.js script *perf/lib/bigdecimal_GWT/bugs.js* for examples of flaws in its *remainder*, *divide* and *compareTo* methods.
 | |
| 
 | |
| *bigtime.js* is a Node.js command-line application which tests the performance of big.js against the GWT version of
 | |
| BigDecimal from the npm registry.
 | |
| 
 | |
| For example, to compare the time taken by the big.js `plus` method and the BigDecimal `add` method
 | |
| 
 | |
|     $ node bigtime plus 10000 40
 | |
| 
 | |
| This will time 10000 calls to each, using operands of up to 40 random digits and will check that the results match.
 | |
| 
 | |
| For help
 | |
| 
 | |
|     $ node bigtime -h
 | |
| 
 | |
| ## Build
 | |
| 
 | |
| If [uglify-js](https://github.com/mishoo/UglifyJS2) is installed globally
 | |
| 
 | |
|     $ npm install uglify-js -g
 | |
| 
 | |
| then
 | |
| 
 | |
|     $ npm run build
 | |
| 
 | |
| will create *big.min.js*.
 | |
| 
 | |
| ## TypeScript
 | |
| 
 | |
| The [DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped) project has a Typescript type definitions file for big.js.
 | |
| 
 | |
|     $ npm install @types/big.js
 | |
| 
 | |
| Any questions about the TypeScript type definitions file should be addressed to the DefinitelyTyped project.
 | |
| 
 | |
| ## Feedback
 | |
| 
 | |
| Bugs/comments/questions?
 | |
| 
 | |
| Open an issue, or email <a href="mailto:M8ch88l@gmail.com">Michael</a>
 | |
| 
 | |
| ## Licence
 | |
| 
 | |
| [MIT](LICENCE)
 | |
| 
 | |
| ## Contributors
 | |
| 
 | |
| This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
 | |
| <a href="graphs/contributors"><img src="https://opencollective.com/bigjs/contributors.svg?width=890&button=false" /></a>
 | |
| 
 | |
| 
 | |
| ## Backers
 | |
| 
 | |
| Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bigjs#backer)]
 | |
| 
 | |
| <a href="https://opencollective.com/bigjs#backers" target="_blank"><img src="https://opencollective.com/bigjs/backers.svg?width=890"></a>
 | |
| 
 | |
| 
 | |
| ## Sponsors
 | |
| 
 | |
| Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bigjs#sponsor)]
 | |
| 
 | |
| <a href="https://opencollective.com/bigjs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/0/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/1/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/2/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/3/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/4/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/5/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/6/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/7/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/8/avatar.svg"></a>
 | |
| <a href="https://opencollective.com/bigjs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/9/avatar.svg"></a>
 | |
| 
 | |
| 
 |