1 |
3a515b92
|
cagy
|
# big.js
|
2 |
|
|
|
3 |
|
|
**A small, fast JavaScript library for arbitrary-precision decimal arithmetic.**
|
4 |
|
|
|
5 |
|
|
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.
|
6 |
|
|
|
7 |
|
|
## Features
|
8 |
|
|
|
9 |
|
|
- Faster, smaller and easier-to-use than JavaScript versions of Java's BigDecimal
|
10 |
|
|
- Only 5.9 KB minified and 2.7 KB gzipped
|
11 |
|
|
- Simple API
|
12 |
|
|
- Replicates the `toExponential`, `toFixed` and `toPrecision` methods of JavaScript's Number type
|
13 |
|
|
- Includes a `sqrt` method
|
14 |
|
|
- Stores values in an accessible decimal floating point format
|
15 |
|
|
- No dependencies
|
16 |
|
|
- Comprehensive [documentation](http://mikemcl.github.io/big.js/) and test set
|
17 |
|
|
|
18 |
|
|
## Set up
|
19 |
|
|
|
20 |
|
|
The library is the single JavaScript file *big.js* (or *big.min.js*, which is *big.js* minified).
|
21 |
|
|
|
22 |
|
|
Browser:
|
23 |
|
|
|
24 |
|
|
```html
|
25 |
|
|
<script src='path/to/big.js'></script>
|
26 |
|
|
```
|
27 |
|
|
|
28 |
|
|
[Node.js](http://nodejs.org):
|
29 |
|
|
|
30 |
|
|
```bash
|
31 |
|
|
$ npm install big.js
|
32 |
|
|
```
|
33 |
|
|
|
34 |
|
|
```javascript
|
35 |
|
|
const Big = require('big.js');
|
36 |
|
|
```
|
37 |
|
|
|
38 |
|
|
ES6 module:
|
39 |
|
|
|
40 |
|
|
```javascript
|
41 |
|
|
import Big from 'big.mjs';
|
42 |
|
|
```
|
43 |
|
|
## Use
|
44 |
|
|
|
45 |
|
|
*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.*
|
46 |
|
|
|
47 |
|
|
The library exports a single function, `Big`, the constructor of Big number instances.
|
48 |
|
|
It accepts a value of type number, string or Big number object.
|
49 |
|
|
|
50 |
|
|
x = new Big(123.4567)
|
51 |
|
|
y = Big('123456.7e-3') // 'new' is optional
|
52 |
|
|
z = new Big(x)
|
53 |
|
|
x.eq(y) && x.eq(z) && y.eq(z) // true
|
54 |
|
|
|
55 |
|
|
A Big number is immutable in the sense that it is not changed by its methods.
|
56 |
|
|
|
57 |
|
|
0.3 - 0.1 // 0.19999999999999998
|
58 |
|
|
x = new Big(0.3)
|
59 |
|
|
x.minus(0.1) // "0.2"
|
60 |
|
|
x // "0.3"
|
61 |
|
|
|
62 |
|
|
The methods that return a Big number can be chained.
|
63 |
|
|
|
64 |
|
|
x.div(y).plus(z).times(9).minus('1.234567801234567e+8').plus(976.54321).div('2598.11772')
|
65 |
|
|
x.sqrt().div(y).pow(3).gt(y.mod(z)) // true
|
66 |
|
|
|
67 |
|
|
Like JavaScript's Number type, there are `toExponential`, `toFixed` and `toPrecision` methods.
|
68 |
|
|
|
69 |
|
|
x = new Big(255.5)
|
70 |
|
|
x.toExponential(5) // "2.55500e+2"
|
71 |
|
|
x.toFixed(5) // "255.50000"
|
72 |
|
|
x.toPrecision(5) // "255.50"
|
73 |
|
|
|
74 |
|
|
The arithmetic methods always return the exact result except `div`, `sqrt` and `pow`
|
75 |
|
|
(with negative exponent), as these methods involve division.
|
76 |
|
|
|
77 |
|
|
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.
|
78 |
|
|
|
79 |
|
|
Big.DP = 10
|
80 |
|
|
Big.RM = 1
|
81 |
|
|
|
82 |
|
|
x = new Big(2);
|
83 |
|
|
y = new Big(3);
|
84 |
|
|
z = x.div(y) // "0.6666666667"
|
85 |
|
|
z.sqrt() // "0.8164965809"
|
86 |
|
|
z.pow(-3) // "3.3749999995"
|
87 |
|
|
z.times(z) // "0.44444444448888888889"
|
88 |
|
|
z.times(z).round(10) // "0.4444444445"
|
89 |
|
|
|
90 |
|
|
Multiple Big number constructors can be created, each with an independent configuration.
|
91 |
|
|
|
92 |
|
|
The value of a Big number is stored in a decimal floating point format in terms of a coefficient, exponent and sign.
|
93 |
|
|
|
94 |
|
|
x = new Big(-123.456);
|
95 |
|
|
x.c // [1,2,3,4,5,6] coefficient (i.e. significand)
|
96 |
|
|
x.e // 2 exponent
|
97 |
|
|
x.s // -1 sign
|
98 |
|
|
|
99 |
|
|
For further information see the [API](http://mikemcl.github.io/big.js/) reference from the *doc* folder.
|
100 |
|
|
|
101 |
|
|
## Test
|
102 |
|
|
|
103 |
|
|
The *test* directory contains the test scripts for each Big number method.
|
104 |
|
|
|
105 |
|
|
The tests can be run with Node.js or a browser.
|
106 |
|
|
|
107 |
|
|
To run all the tests
|
108 |
|
|
|
109 |
|
|
$ npm test
|
110 |
|
|
|
111 |
|
|
To test a single method
|
112 |
|
|
|
113 |
|
|
$ node test/toFixed
|
114 |
|
|
|
115 |
|
|
For the browser, see *single-test.html* and *every-test.html* in the *test/browser* directory.
|
116 |
|
|
|
117 |
|
|
*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.
|
118 |
|
|
|
119 |
|
|
## Performance
|
120 |
|
|
|
121 |
|
|
The *perf* directory contains two legacy applications and a *lib* directory containing the BigDecimal libraries used by both.
|
122 |
|
|
|
123 |
|
|
*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.
|
124 |
|
|
|
125 |
|
|
* [GWT: java.math.BigDecimal](https://github.com/iriscouch/bigdecimal.js)
|
126 |
|
|
* [ICU4J: com.ibm.icu.math.BigDecimal](https://github.com/dtrebbien/BigDecimal.js)
|
127 |
|
|
|
128 |
|
|
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.
|
129 |
|
|
|
130 |
|
|
*bigtime.js* is a Node.js command-line application which tests the performance of big.js against the GWT version of
|
131 |
|
|
BigDecimal from the npm registry.
|
132 |
|
|
|
133 |
|
|
For example, to compare the time taken by the big.js `plus` method and the BigDecimal `add` method
|
134 |
|
|
|
135 |
|
|
$ node bigtime plus 10000 40
|
136 |
|
|
|
137 |
|
|
This will time 10000 calls to each, using operands of up to 40 random digits and will check that the results match.
|
138 |
|
|
|
139 |
|
|
For help
|
140 |
|
|
|
141 |
|
|
$ node bigtime -h
|
142 |
|
|
|
143 |
|
|
## Build
|
144 |
|
|
|
145 |
|
|
If [uglify-js](https://github.com/mishoo/UglifyJS2) is installed globally
|
146 |
|
|
|
147 |
|
|
$ npm install uglify-js -g
|
148 |
|
|
|
149 |
|
|
then
|
150 |
|
|
|
151 |
|
|
$ npm run build
|
152 |
|
|
|
153 |
|
|
will create *big.min.js*.
|
154 |
|
|
|
155 |
|
|
## TypeScript
|
156 |
|
|
|
157 |
|
|
The [DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped) project has a Typescript type definitions file for big.js.
|
158 |
|
|
|
159 |
|
|
$ npm install @types/big.js
|
160 |
|
|
|
161 |
|
|
Any questions about the TypeScript type definitions file should be addressed to the DefinitelyTyped project.
|
162 |
|
|
|
163 |
|
|
## Feedback
|
164 |
|
|
|
165 |
|
|
Bugs/comments/questions?
|
166 |
|
|
|
167 |
|
|
Open an issue, or email <a href="mailto:M8ch88l@gmail.com">Michael</a>
|
168 |
|
|
|
169 |
|
|
## Licence
|
170 |
|
|
|
171 |
|
|
[MIT](LICENCE)
|
172 |
|
|
|
173 |
|
|
## Contributors
|
174 |
|
|
|
175 |
|
|
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
176 |
|
|
<a href="graphs/contributors"><img src="https://opencollective.com/bigjs/contributors.svg?width=890&button=false" /></a>
|
177 |
|
|
|
178 |
|
|
|
179 |
|
|
## Backers
|
180 |
|
|
|
181 |
|
|
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bigjs#backer)]
|
182 |
|
|
|
183 |
|
|
<a href="https://opencollective.com/bigjs#backers" target="_blank"><img src="https://opencollective.com/bigjs/backers.svg?width=890"></a>
|
184 |
|
|
|
185 |
|
|
|
186 |
|
|
## Sponsors
|
187 |
|
|
|
188 |
|
|
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)]
|
189 |
|
|
|
190 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/0/avatar.svg"></a>
|
191 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/1/avatar.svg"></a>
|
192 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/2/avatar.svg"></a>
|
193 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/3/avatar.svg"></a>
|
194 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/4/avatar.svg"></a>
|
195 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/5/avatar.svg"></a>
|
196 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/6/avatar.svg"></a>
|
197 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/7/avatar.svg"></a>
|
198 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/8/avatar.svg"></a>
|
199 |
|
|
<a href="https://opencollective.com/bigjs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/bigjs/sponsor/9/avatar.svg"></a>
|
200 |
|
|
|
201 |
|
|
|