big-rational
Version:
An arbitrary length rational number library for Javascript
318 lines (220 loc) • 7.83 kB
Markdown
BigRational.js
=========
**BigRational.js** is an arbitrary-length rational number library for Javascript, allowing arithmetic operations on rational numbers of unlimited size, notwithstanding memory and time limitations.
A *rational number* is stored internally as a pair of two big integers. Because of this, BigRational.js depends on my big integer library, [BigInteger.js](https://github.com/peterolson/BigInteger.js).
Installation
If you are using a browser, you can download [BigRational.js from GitHub](http://peterolson.github.com/BigRational.js/BigInt_BigRat.min.js) or just hotlink to it.
<script src="http://peterolson.github.com/BigRational.js/BigInt_BigRat.min.js"></script>
This will include both the `bigInt` library and the `bigRat` library. If you want to reference them separately, you can use the [non-combined BigRational.js script](http://peterolson.github.com/BigRational.js/BigRational.min.js).
If you are using node, you can install BigRational.js with [npm](https://npmjs.org/).
npm install big-rational
Then you can include it in your code
var bigRat = require("big-rational");
`bigRat(num?, denom?)`
You can create a bigRational by calling the `bigRat` function. You can pass in up to two paramers.
**`bigRat()`**
If you pass in zero parameters, it will return zero.
**`bigRat(n)`**
If you pass in one parameter, it must be one of the following:
- a string, which may be
- an integer, such as `"12345"`,
- a numerator over a denominator, such as `"2/3"`,
- a mixed fraction, such as `"1_1/2"`
- a decimal number, such as `"54.05446"`
- a Javascript number
- a bigInteger
- a bigRational
**`bigRat(num, denom)`**
If you pass in two parameters, the first will be interpreted as the numerator, and the second as the denominator. Both parameters must be one of the following:
- a string in integer form, such as `"12345"`
- a JavaScript number that is an integer, such as `12345`
- a bigInteger
**Examples:**
var zero = bigRat();
var threeFourths = bigRat("3/4") ||
bigRat("3", "4") ||
bigRat(3, 4) ||
bigRat(3 / 4) ||
bigRat(0.75);
var fiveHalves = bigRat("5/2") ||
bigRat("2_1/2");
Method Chaining
Note that bigRat operations return bigRats, which allows you to chain methods, for example:
var salary = bigRat(dollarsPerHour).times(hoursWorked).plus(randomBonuses)
Constants
There are three constants already stored that you do not have to construct with the `bigRat` function yourself:
- `bigRat.one`, equivalent to `bigRat(1)`
- `bigRat.zero`, equivalent to `bigRat(0)`
- `bigRat.minusOne`, equivalent to `bigRat(-1)`
Properties
===
You can obtain the numerator and denominator of a bigRational with these properties:
`numerator`
Returns the numerator of a bigRational. This will be a bigInt.
- `bigRat(34, 3).numerator` => `bigInt(34)`
`denominator`
Returns the denominator of a bigRational. This will be a bigInt.
- `bigRat(34, 3).denominator` => `bigInt(3)`
`num`
Alias for the `numerator` property
`denom`
Alias for the `denominator` property
Methods
===
`abs`
Returns the absolute value of a number.
- `bigRat(-424).abs().equals(424)`
`add`
Performs addition.
- `bigRat("1/3").add(1, 3).equals(2, 3)`
`ceil(toBigInt?)`
Rounds up to the nearest integer. If the `toBigInt` argument is `true`, then it will return a bigInteger instead of a bigRational.
- `bigRat(12345.4).ceil().equals(12346)`
`compareAbs`
Performs a comparison between the absolute values of two numbers. If the numbers are of equal magnitude, it returns `0`. If the first number is of greater magnitude, it returns `1`. Otherwise, it returns `-1`.
- `bigRat(-3).compareAbs(3) === 0`
- `bigRat(3).compareAbs(-4) === -1`
- `bigRat(-4).compareAbs(3) === 1`
`compare`
Performs a comparison between two numbers. If the numbers are equal, it returns `0`. If the first number is greater, it returns `1`. If the first number is lesser, it returns `-1`.
- `bigRat(3).compare(3) === 0`
- `bigRat(3).compare(4) === -1`
- `bigRat(4).compare(3) === 1`
`compareTo`
Alias for the `compare` function.
`divide`
Performs division.
- `bigRat("354.25").divide(1, 4).equals(1417)`
`eq`
Alias for the `equals` function.
`equals`
Checks if two numbers are equal.
- `bigRat(1).equals(1)`
`floor(toBigInt?)`
Rounds down to the nearest integer. If the `toBigInt` argument is `true`, then it will return a bigInteger instead of a bigRational.
- `bigRat(987.99999).floor().equals(987)`
`geq`
Alias for the `greaterOrEquals` function.
`greater`
Checks if the first number is greater than the second
- `bigRat(5).greater(4)`
`greaterOrEquals`
Checks if the first number is greater than or equal to the second
- `bigRat(5).greaterOrEquals(5)`
- `bigRat(5).greaterOrEquals(4)`
`gt`
Alias for the `greater` function.
`isNegative`
Returns `true` if the number is negative, `false` otherwise.
- `bigRat(-7).isNegative()`
`isPositive`
Returns `true` if the number is positive, `false` otherwise.
- `bigRat(7).isPositive()`
`isZero`
Returns `true` if the number equals 0, `false` otherwise.
- `bigRat(0).isZero()`
`lesser`
Checks if the first number is lesser than the second
- `bigRat(4).lesser(5)`
`lesserOrEquals`
Checks if the first number is lesser than or equal to the second
- `bigRat(4).lesserOrEquals(4)`
- `bigRat(4).lesserOrEquals(5)`
`leq`
Alias for the `lesserOrEquals` function.
`lt`
Alias for the `lesser` function.
`minus`
Alias for `subtract`.
`mod`
Performs the modulo operation.
- `bigRat(3).mod(2).equals(1)`
`multiply`
Performs multiplication.
- `bigRat(70, 2).multiply(4).equals(140)`
`negate`
Returns the negation of a number.
- `bigRat(234).negate().equals(-234)`
`neq`
Alias for the `notEquals` function.
`notEquals`
Checks if two numbers are not equal.
- `bigRat(1).notEquals(2)`
`over`
Alias for `divide`.
`plus`
Alias for `add`.
`pow`
Performs exponentiation. The argument will be parsed as a bigInt.
- `bigRat("3/2").pow(3)` => `bigRat("27/8")`
`reciprocate`
Returns the reciprocal of a number.
- `bigRat("3/2").reciprocate()` => `bigRat("2/3")`
`round(toBigInt?)`
Rounds a number to the nearest integer. If the number is exactly half-way between two integers, it will round up.
If the `toBigInt` argument is `true`, then it will return a bigInteger instead of a bigRational.
- `bigRat(54345.12566).round().equals(54345)`
- `bigRat(1234567.5).round().equals(1234568)`
- `bigRat(69.8).round().equals(70)`
`subtract`
Performs subtraction.
- `bigRat(3).subtract(2).equals(1)`
`times`
Alias for `multiply`.
`toDecimal(digits?)`
Converts a bigRational to a string in decimal notation, cut off after the number of digits specified in the `digits` argument. The default number of digits is 10.
- `bigRat(1,3).toDecimal() === "0.33333333333"`
- `bigRat(1,7).toDecimal(14) === "0.14285714285714"`
Override Methods
===
`toString()`
Converts a bigRat to a string in "numerator/denominator" notation.
- `bigRat(145.545).toString() === "29109/200"`
`valueOf()`
Converts a bigRat to a native Javascript number. This override allows you to use native arithmetic operators without explicit conversion:
- `bigRat(1, 4) + bigRat(3, 4) === 1`