A comprehensive JavaScript library for precise rational number arithmetic using BigInt representation.
npx @tessl/cli install tessl/npm-fraction-js@5.3.0Fraction.js is a comprehensive JavaScript library that provides precise rational number arithmetic using BigInt representation to overcome floating-point precision limitations. The library enables developers to perform accurate calculations with fractions, convert decimal numbers to their exact fractional representations, and handle mathematical operations without the rounding errors inherent in floating-point arithmetic.
npm install fraction.jsimport Fraction from "fraction.js";For CommonJS:
const Fraction = require("fraction.js");For ESM with named import:
import { Fraction } from "fraction.js";import Fraction from "fraction.js";
// Create fractions from various inputs
const f1 = new Fraction(1, 3); // 1/3
const f2 = new Fraction("0.333"); // Approximate 1/3
const f3 = new Fraction("0.(3)"); // Exact 1/3 with repeating decimal
const f4 = new Fraction([2, 7]); // 2/7
const f5 = new Fraction({n: 5, d: 8}); // 5/8
// Perform arithmetic operations
const sum = f1.add(f5); // 1/3 + 5/8 = 23/24
const product = f2.mul(f4); // Chain operations
const result = product.div(2).simplify();
// Convert to different formats
console.log(sum.toString()); // "0.958(3)"
console.log(sum.toFraction()); // "23/24"
console.log(sum.valueOf()); // 0.9583333333333334Fraction.js is built around several key components:
Core arithmetic operations including addition, subtraction, multiplication, division, and exponentiation. All operations maintain precision and return simplified fractions.
function add(num: FractionInput): Fraction;
function add(numerator: number | bigint, denominator: number | bigint): Fraction;
function sub(num: FractionInput): Fraction;
function sub(numerator: number | bigint, denominator: number | bigint): Fraction;
function mul(num: FractionInput): Fraction;
function mul(numerator: number | bigint, denominator: number | bigint): Fraction;
function div(num: FractionInput): Fraction;
function div(numerator: number | bigint, denominator: number | bigint): Fraction;
function pow(exponent: FractionInput): Fraction | null;
function pow(numerator: number | bigint, denominator: number | bigint): Fraction | null;Advanced mathematical operations including modulo, GCD, LCM, logarithms, and utility functions like absolute value and negation.
function mod(): Fraction;
function mod(num: FractionInput): Fraction;
function gcd(num: FractionInput): Fraction;
function gcd(numerator: number | bigint, denominator: number | bigint): Fraction;
function lcm(num: FractionInput): Fraction;
function lcm(numerator: number | bigint, denominator: number | bigint): Fraction;
function log(base: FractionInput): Fraction | null;
function log(numerator: number | bigint, denominator: number | bigint): Fraction | null;
function abs(): Fraction;
function neg(): Fraction;
function inverse(): Fraction;Comparison operations and utility functions for testing equality, ordering, divisibility, and rounding operations.
function equals(num: FractionInput): boolean;
function lt(num: FractionInput): boolean;
function lte(num: FractionInput): boolean;
function gt(num: FractionInput): boolean;
function gte(num: FractionInput): boolean;
function compare(num: FractionInput): number;
function divisible(num: FractionInput): boolean;
function ceil(places?: number): Fraction;
function floor(places?: number): Fraction;
function round(places?: number): Fraction;
function roundTo(num: FractionInput): Fraction;Methods for converting fractions to various string and numeric representations, including decimal, fractional, LaTeX, and continued fraction formats.
function valueOf(): number;
function toString(decimalPlaces?: number): string;
function toFraction(showMixed?: boolean): string;
function toLatex(showMixed?: boolean): string;
function toContinued(): bigint[];
function clone(): Fraction;
function simplify(eps?: number): Fraction;class Fraction {
constructor();
constructor(num: FractionInput);
constructor(numerator: number | bigint, denominator: number | bigint);
// Instance properties
s: bigint; // Sign (-1n or 1n)
n: bigint; // Numerator (always positive)
d: bigint; // Denominator (always positive)
}
// Input types
type FractionInput =
| Fraction
| number
| bigint
| string
| [number | bigint | string, number | bigint | string]
| NumeratorDenominator;
interface NumeratorDenominator {
n: number | bigint;
d: number | bigint;
s?: number | bigint; // Optional sign
}The library throws specific errors for invalid operations:
try {
const invalid = new Fraction(1, 0); // Throws "Division by Zero"
} catch (error) {
console.error(error.message);
}