# money-math

bignum-based arbitrary precision operations on currency amounts "XXX.YY"; because floats are BAD for representing money

``npm install money-math``

# What does it do?

Adds, multiplies the currency amounts, and calculates percentages of amounts. The result of each of those operations is also an amount: a string, strictly matching the `/^\-?\d+\.\d\d\$/` pattern, like "0.25", "1000.00", or "-42.10".

Amounts on input and output are arbitrary large and precise:

``````99999999999999999999999999999999999999999999999999999999999999999999999999999999.99
+
0.01
=
100000000000000000000000000000000000000000000000000000000000000000000000000000000.00
``````

However, in cases when the division is involved — like for percentage calculation — the result is rounded to the whole cent.

``````money.percent("0.50", "33.00")  // is "0.17" instead of "0.165"
``````

As a bonus feature, there's a simple formatting function for amounts in CHF, EUR, USD, GBP, and JPY.

``````money.format("EUR", "-1560.00") // "-1.560,00"
``````

# Why does it exist?

Because storing currency amounts in floats is a really bad idea

# How to use it?

``````\$ npm install money-math
``````

Then

``````var money = require("money-math");

money.subtract("16.00", "7.00");    // "9.00"
money.mul("24.00", "0.25");         // "6.00"
money.div("64.00", "2.00");         // "32.00"
money.percent("200.00", "3.25");    // "6.50"

money.format("JPY", "236800.00");   // "236,800"
money.floatToAmount(56.345);        // "56.35"
``````

And last, but not least :)

``````money.roundUpTo5Cents("42.02");     // "42.05"
``````

Which we use for bills in CHF that are required by law to be 0 (mod 5).