Projekt

Obecné

Profil

Stáhnout (7.95 KB) Statistiky
| Větev: | Revize:
1
# 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

    
(3-3/7)