• Stars
    star
    241
  • Rank 162,224 (Top 4 %)
  • Language
    Ruby
  • License
    Apache License 2.0
  • Created over 12 years ago
  • Updated over 11 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Arbitrary-precision Javascript BigInteger and BigDecimal real numbers

BigDecimal for Javascript

BigDecimal for Javascript is a pure-Javascript implementation of immutable, arbitrary-precision, signed decimal numbers. BigDecimal supports decimal math with arbitrary precision.

For a limited time, we will throw in BigInteger support at no extra charge!

Purpose

If this is a problem for you:

node> 0.1 + 0.2
0.30000000000000004

Then you need BigDecimal for Javascript. BigDecimal is great for arithmetic of financial information, or anything exceeding the Javascript Number (IEEE-754 float) type. Decimal did not make the cut in the new ECMAScript standards so it’s time we got our act together.

Usage

BigDecimal works in the browser and in Apache CouchDB. See the simple BigDecimal Couch app demo to compare server-side and client-side expression evaluation.

BigDecimal is available in the NPM repository for NodeJS.

npm install bigdecimal

Now use it normally. It is exactly like the Java 1.5 BigInteger and BigDecimal API. See the BigDecimal documentation for information.

var bigdecimal = require("bigdecimal");

var i = new bigdecimal.BigInteger("1234567890abcdefghijklmn", 24);
console.log("i is " + i);
// Output: i is 60509751690538858612029415201127

var d = new bigdecimal.BigDecimal(i);
var x = new bigdecimal.BigDecimal("123456.123456789012345678901234567890");
console.log("d * x = " + d.multiply(x));
// Output: d * x = 7470299375046812977089832214047022056.555930270554343863089286012030

var two = new bigdecimal.BigDecimal('2');
console.log("Average = " + d.add(x).divide(two));
// Output: Average = 30254875845269429306014707662291.561728394506172839450617283945

var down = bigdecimal.RoundingMode.DOWN();
console.log("d / x (25 decimal places) = " + d.divide(x, 25, DOWN));
// Output: d / x (25 decimal places) = 490131635404200348624039911.8662623025579331926181155

There is also a command-line REPL tool for experimentation, bigdecimal.js if you install with the -g switch, or ./node_modules/.bin/bigdecimal.js otherwise. The bigdecimal module is already loaded, also available as BD for convenience.

bigdecimal.js
BigDec> d = new BD.BigDecimal("123456.123456789012345678901234567890")

Implementation

This code is compiled Javascript, originating from the Google GWT project. GWT version 2.1 supports the Java BigDecimal class. The implementation came from the Apache Harmony project by way of gwt-java-math which optimized it for the Javascript compiler.

Compiled Javascript is a problem; however that is offset by these benefits:

  • The implementation is mature, optimized, and maintained by Apache and Google
  • The API is well-known, compatible with the J2SE BigDecimal and BigInteger class

If you can’t stand the idea of running machine-generated code, please implement BigInteger and BigDecimal in native Javascript; convince the world your implementation is trustworthy, reasonably bug-free, and sure to be maintained for several years and I will glady include it in this project.

Builds

Ready-to-use Javascript builds are available in the tagged Git revisions. Click the Download Source button at the top and choose a vX.Y tag. The built code will be in lib/bigdecimal.js.

To build BigDecimal yourself from source, follow these steps:

  1. Download the GWT SDK, version 2.4.0. Extract it in this checkout, as gwt-2.4.0/
  2. Get Apache Ant if you don't have it (try just running ant at the command line). I just unpack it in this checkout and add $PWD/apche-ant-1.8.2/bin to my PATH.
  3. rake clean
  4. rake

As with the prebuilt download, the CommonJS module will be in lib/bigdecimal.js.

License

BigDecimal for Javascript is licensed under the Apache License, version 2.0.

More Repositories

1

follow

Very stable, very reliable, NodeJS CouchDB _changes follower
JavaScript
386
star
2

browser-request

Browser library compatible with Node.js request package
JavaScript
358
star
3

dnsd

Dynamic authoritative name server
JavaScript
269
star
4

couchjs

Drop-in replacement JavaScript engine for Apache CouchDB
JavaScript
88
star
5

browserid_couchdb

Mozilla BrowserID support plugin for CouchDB
Erlang
58
star
6

request_jquery

request (NodeJS http client) API using jQuery back-end
JavaScript
56
star
7

manage_couchdb

General CouchDB management tools
JavaScript
54
star
8

traceback

Easy access to the call stack, for Node.js
43
star
9

fastcgi

Simple, robust node.js web server that runs FastCGI applications
JavaScript
38
star
10

procouch

Professional, production CouchDB: auto-view update and cleanup, auto-compact, auto-purge, auto-deploy
JavaScript
15
star
11

erlang-request

The Node.js request API for Erlang
Erlang
13
star
12

static-plus

Build static web sites from templates. Plus.
JavaScript
11
star
13

obj_diff

See (and assert) differences between JS objects, useful for CouchDB validations
JavaScript
11
star
14

stripe_kanso

Kanso and CouchDB support for the Stripe payments API
JavaScript
5
star
15

futon_couchdb

Better Futon
JavaScript
5
star
16

fixed-event

Javascript EventEmitter for one-time tasks
JavaScript
5
star
17

iris-redis

Thin node_redis wrapper to connect to Iris Couch's Redis service
JavaScript
5
star
18

veil

Convert RFC822 and HTTP messages (headers, body) to Javascript objects
JavaScript
4
star
19

query_couchdb

Easy CouchDB queries, similar to Google App Engine
JavaScript
3
star
20

stew

Easy reduce function that does what you want, for Kanso.js
JavaScript
3
star
21

thaijs

thaijs.com site
Shell
2
star
22

browser_bin

Convert an NPM package command-line program into a web page
JavaScript
2
star
23

public_couchdb

Public CouchDB repo
Erlang
1
star
24

voodootikigod-upgrade

Upgrade the minutewith sites
JavaScript
1
star
25

cors_couchdb

Cross-Object Resource Sharing utilities for CouchDB
JavaScript
1
star