Skip to content

BigDecimal

Decimal numbers and arithmetic for cases where JavaScript number rounding is not precise enough. A BigDecimal stores digits as a bigint plus a decimal scale, which lets the module parse, compare, add, subtract, multiply, divide, round, and format decimal values such as money, quantities, and measurements.

45 exports Added in v2.0.0 Source

Constructors

fromBigInt

Added in v2.0.0 Source

Creates a BigDecimal from a bigint value.

When to use

Use to construct an integer BigDecimal from a bigint.

See

  • make for constructing a decimal with an explicit scale

Signature

declare function fromBigInt(n: bigint): BigDecimal;

fromNumber

Added in v2.0.0 Source

Creates a BigDecimal safely from a finite number.

When to use

Use to convert a finite JavaScript number to a BigDecimal without throwing on invalid input.

Details

Returns Option.none() for NaN, +Infinity or -Infinity.

Gotchas

It is not recommended to convert a floating point number to a decimal directly, as the floating point representation may be unexpected.

See

Signature

declare function fromNumber(n: number): Option<BigDecimal>;

Creates a BigDecimal from a finite number.

When to use

Use when you need to convert a trusted finite JavaScript number to a BigDecimal and want a plain result instead of an Option.

Gotchas

It is not recommended to convert a floating point number to a decimal directly, as the floating point representation may be unexpected. Throws a RangeError if the number is not finite (NaN, +Infinity or -Infinity).

See

  • fromNumber for returning Option.none when the number is not finite

Signature

declare function fromNumberUnsafe(n: number): BigDecimal;

fromString

Added in v2.0.0 Source

Parses a decimal string into a BigDecimal safely.

When to use

Use to parse external decimal text without throwing on invalid input.

Details

Returns Option.some for valid decimal or exponent notation and Option.none when the string cannot be parsed or would produce an unsafe scale. The empty string parses as zero.

See

Signature

declare function fromString(s: string): Option<BigDecimal>;

Parses a decimal string into a BigDecimal, throwing if the string is invalid.

When to use

Use when you expect decimal text to be valid and want parse errors to throw.

Details

Accepts the same syntax as fromString. Use fromString when invalid input should be represented as Option.none instead of throwing.

See

  • fromString for returning Option.none on invalid input

Signature

declare function fromStringUnsafe(s: string): BigDecimal;

make

Added in v2.0.0 Source

Creates a BigDecimal from a bigint value and a scale.

When to use

Use to construct a decimal directly from its unscaled integer value and decimal scale.

See

  • fromBigInt for constructing an integer decimal from a bigint

Signature

declare function make(value: bigint, scale: number): BigDecimal;

Converting

format

Added in v2.0.0 Source

Formats a BigDecimal as a string.

When to use

Use to render a BigDecimal as plain decimal text when possible.

Details

The value is normalized before formatting. Scientific notation is used when the absolute value of the normalized scale is at least 16; otherwise plain decimal notation is used.

See

Signature

declare function format(n: BigDecimal): string;

toExponential

Added in v3.11.0 Source

Formats a given BigDecimal as a string in scientific notation.

When to use

Use to render a BigDecimal in scientific notation.

See

  • format for plain decimal formatting when possible

Signature

declare function toExponential(n: BigDecimal): string;

Converts a BigDecimal to a JavaScript number.

When to use

Use when you need a JavaScript number at an interop boundary where precision loss is acceptable.

Gotchas

This conversion is unsafe because the result can lose integer or fractional precision, round to a nearby representable value, or become Infinity when the decimal cannot be represented as a finite JavaScript number.

See

  • format for preserving decimal precision as text

Signature

declare function toNumberUnsafe(n: BigDecimal): number;

Guards

isBigDecimal

Added in v2.0.0 Source

Checks whether a given value is a BigDecimal.

When to use

Use to validate unknown input and narrow it to BigDecimal.

Signature

declare function isBigDecimal(u: unknown): u is BigDecimal;

Instances

Equivalence

Added in v2.0.0 Source

Provides an Equivalence instance for BigDecimal that determines equality between BigDecimal values.

When to use

Use when comparing decimal values through APIs that accept an equivalence relation.

Signature

declare const Equivalence: Equ.Equivalence<BigDecimal>;

Order

Added in v2.0.0 Source

Provides an Order instance for BigDecimal that allows comparing and sorting BigDecimal values.

When to use

Use when you need to sort or compare decimal values through APIs that accept an ordering instance.

Signature

declare const Order: order.Order<BigDecimal>;

Math

abs

Added in v2.0.0 Source

Determines the absolute value of a given BigDecimal.

When to use

Use to remove the sign from a BigDecimal while preserving its magnitude.

Signature

declare function abs(n: BigDecimal): BigDecimal;

ceil

Added in v3.16.0 Source

Computes the ceiling of a BigDecimal at the given scale.

When to use

Use to round a decimal toward positive infinity at a requested scale.

Details

The default scale is 0. Positive scales keep digits to the right of the decimal point, and negative scales round positions to the left of the decimal point.

See

  • floor for rounding toward negative infinity
  • truncate for rounding toward zero
  • round for configurable rounding modes Example (Rounding decimals up) ``ts import.meta.vitest import { BigDecimal } from "effect" BigDecimal.ceil(BigDecimal.fromStringUnsafe("145"), -1) // => BigDecimal.fromBigInt(150n) BigDecimal.ceil(BigDecimal.fromStringUnsafe("-14.5")) // => BigDecimal.fromBigInt(-14n) ``

Signature

declare const ceil: {
  (scale: number): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, scale?: number): BigDecimal;
};

clamp

Added in v2.0.0 Source

Restricts the given BigDecimal to be within the range specified by the minimum and maximum values.

When to use

Use to force a BigDecimal into an inclusive range.

Details

If the BigDecimal is less than the minimum value, the function returns the minimum value. If it is greater than the maximum value, the function returns the maximum value. Otherwise, it returns the original BigDecimal.

See

  • between for checking whether a BigDecimal is already inside a range

Signature

declare const clamp: {
  (options: { maximum: BigDecimal; minimum: BigDecimal }): (self: BigDecimal) => BigDecimal;
  (
    self: BigDecimal,
    options: {
      maximum: BigDecimal;
      minimum: BigDecimal;
    },
  ): BigDecimal;
};

divide

Added in v2.0.0 Source

Divides BigDecimals safely.

When to use

Use to divide BigDecimal values while representing division by zero as Option.none.

Details

If the dividend is not a multiple of the divisor, the result will be a BigDecimal value with up to the default division precision. If the divisor is 0, the result will be Option.none().

See

  • divideUnsafe for division that throws when the divisor is zero
  • remainder for the decimal remainder operation

Signature

declare const divide: {
  (that: BigDecimal): (self: BigDecimal) => Option<BigDecimal>;
  (self: BigDecimal, that: BigDecimal): Option<BigDecimal>;
};

divideUnsafe

Added in v4.0.0 Source

Provides an unsafe division operation on BigDecimals.

When to use

Use when you need to divide BigDecimal values where the divisor is known to be non-zero, so division by zero should be a thrown exception.

Details

If the dividend is not a multiple of the divisor, the result will be a BigDecimal value with up to the default division precision.

Gotchas

Throws a RangeError if the divisor is 0.

See

  • divide for division that returns Option.none when the divisor is zero

Signature

declare const divideUnsafe: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

floor

Added in v3.16.0 Source

Computes the floor of a BigDecimal at the given scale.

When to use

Use to round a decimal toward negative infinity at a requested scale.

See

  • ceil for rounding toward positive infinity
  • truncate for rounding toward zero
  • round for configurable rounding modes

Signature

declare const floor: {
  (scale: number): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, scale?: number): BigDecimal;
};

max

Added in v2.0.0 Source

Returns the maximum between two BigDecimals.

When to use

Use to select the larger of two BigDecimal values.

See

  • min for selecting the smaller value

Signature

declare const max: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

min

Added in v2.0.0 Source

Returns the minimum between two BigDecimals.

When to use

Use to select the smaller of two BigDecimal values.

See

  • max for selecting the larger value

Signature

declare const min: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

multiply

Added in v2.0.0 Source

Provides a multiplication operation on BigDecimals.

When to use

Use to multiply two BigDecimal values.

See

  • multiplyAll for multiplying an iterable of BigDecimal values

Signature

declare const multiply: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

multiplyAll

Added in v4.0.0 Source

Takes an Iterable of BigDecimals and returns their multiplication as a single BigDecimal.

When to use

Use to multiply all BigDecimal values in an iterable.

See

  • multiply for multiplying two BigDecimal values

Signature

declare function multiplyAll(collection: Iterable<BigDecimal>): BigDecimal;

negate

Added in v2.0.0 Source

Provides a negate operation on BigDecimals.

When to use

Use to flip the sign of a BigDecimal.

Signature

declare function negate(n: BigDecimal): BigDecimal;

remainder

Added in v2.0.0 Source

Computes the decimal remainder safely when one operand is divided by a second operand.

When to use

Use to compute a decimal remainder while representing division by zero as Option.none.

Details

If the divisor is 0, the result will be Option.none().

See

  • remainderUnsafe for remainder calculation that throws when the divisor is zero
  • divide for decimal quotient calculation

Signature

declare const remainder: {
  (divisor: BigDecimal): (self: BigDecimal) => Option<BigDecimal>;
  (self: BigDecimal, divisor: BigDecimal): Option<BigDecimal>;
};

Returns the decimal remainder left over when one operand is divided by a non-zero second operand.

When to use

Use when you need to compute a BigDecimal remainder with a divisor known to be non-zero and want a plain BigDecimal result instead of an Option.

Gotchas

Throws a RangeError if the divisor is 0.

See

  • remainder for returning Option.none when the divisor is zero

Signature

declare const remainderUnsafe: {
  (divisor: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, divisor: BigDecimal): BigDecimal;
};

round

Added in v3.16.0 Source

Computes a rounded BigDecimal at the given scale with the specified rounding mode.

When to use

Use to round a decimal at a requested scale with an explicit rounding mode.

See

  • ceil for fixed rounding toward positive infinity
  • floor for fixed rounding toward negative infinity
  • truncate for fixed rounding toward zero

Signature

declare const round: {
  (options: { mode?: RoundingMode; scale?: number }): (self: BigDecimal) => BigDecimal;
  (
    n: BigDecimal,
    options?: {
      mode?: RoundingMode;
      scale?: number;
    },
  ): BigDecimal;
};

RoundingMode type

Added in v3.16.0 Source

Rounding modes for BigDecimal.

When to use

Use with round to choose how discarded digits affect a BigDecimal rounded to a target scale.

Details

- ceil: round towards positive infinity - floor: round towards negative infinity - to-zero: round towards zero - from-zero: round away from zero - half-ceil: round to the nearest neighbor; if equidistant round towards positive infinity - half-floor: round to the nearest neighbor; if equidistant round towards negative infinity - half-to-zero: round to the nearest neighbor; if equidistant round towards zero - half-from-zero: round to the nearest neighbor; if equidistant round away from zero - half-even: round to the nearest neighbor; if equidistant round to the neighbor with an even digit - half-odd: round to the nearest neighbor; if equidistant round to the neighbor with an odd digit

See

  • round for configurable rounding with a RoundingMode
  • ceil for fixed rounding toward positive infinity
  • floor for fixed rounding toward negative infinity
  • truncate for fixed rounding toward zero

Signature

type RoundingMode =
  | "ceil"
  | "floor"
  | "to-zero"
  | "from-zero"
  | "half-ceil"
  | "half-floor"
  | "half-to-zero"
  | "half-from-zero"
  | "half-even"
  | "half-odd";

sign

Added in v2.0.0 Source

Determines the sign of a given BigDecimal.

When to use

Use to classify a BigDecimal as negative, zero, or positive.

Signature

declare function sign(n: BigDecimal): Ordering;

subtract

Added in v2.0.0 Source

Provides a subtraction operation on BigDecimals.

When to use

Use to subtract one BigDecimal value from another.

Signature

declare const subtract: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

sum

Added in v2.0.0 Source

Provides an addition operation on BigDecimals.

When to use

Use when you need a decimal addition function for piping or higher-order APIs while preserving decimal precision.

See

  • sumAll for summing an iterable of BigDecimal values

Signature

declare const sum: {
  (that: BigDecimal): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, that: BigDecimal): BigDecimal;
};

sumAll

Added in v3.16.0 Source

Takes an Iterable of BigDecimals and returns their sum as a single BigDecimal.

When to use

Use when you need to aggregate decimal quantities with decimal precision instead of converting through JavaScript numbers.

See

  • sum for adding two BigDecimal values

Signature

declare function sumAll(collection: Iterable<BigDecimal>): BigDecimal;

truncate

Added in v3.16.0 Source

Computes a truncated BigDecimal at the given scale. This removes fractional digits beyond the scale, rounding toward zero.

When to use

Use when you need to discard fractional digits beyond a scale rather than round half up, half down, or toward an infinity.

See

  • round for configurable rounding modes
  • ceil for rounding toward positive infinity
  • floor for rounding toward negative infinity

Signature

declare const truncate: {
  (scale: number): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, scale?: number): BigDecimal;
};

Models

BigDecimal interface

Added in v2.0.0 Source

Represents an arbitrary precision decimal number.

When to use

Use when decimal arithmetic needs to avoid JavaScript floating point representation errors.

Signature

interface BigDecimal extends Equal, Pipeable, Inspectable {
  readonly "~effect/BigDecimal": "~effect/BigDecimal";
  readonly scale: number;
  readonly value: bigint;
}

Predicates

between

Added in v2.0.0 Source

Checks whether a BigDecimal is between a minimum and maximum value (inclusive).

When to use

Use to test whether a BigDecimal falls inside an inclusive range.

See

  • clamp for forcing a BigDecimal into an inclusive range

Signature

declare const between: {
  (options: { maximum: BigDecimal; minimum: BigDecimal }): (self: BigDecimal) => boolean;
  (
    self: BigDecimal,
    options: {
      maximum: BigDecimal;
      minimum: BigDecimal;
    },
  ): boolean;
};

equals

Added in v2.0.0 Source

Checks whether two BigDecimals are equal.

When to use

Use to compare two BigDecimal values for numeric equality.

See

  • Equivalence for passing decimal equality to APIs that require an Equivalence

Signature

declare const equals: {
  (that: BigDecimal): (self: BigDecimal) => boolean;
  (self: BigDecimal, that: BigDecimal): boolean;
};

Returns true if the first argument is greater than the second, otherwise false.

When to use

Use to test whether one BigDecimal is strictly greater than another.

Signature

declare const isGreaterThan: {
  (that: BigDecimal): (self: BigDecimal) => boolean;
  (self: BigDecimal, that: BigDecimal): boolean;
};

Checks whether a given BigDecimal is greater than or equal to the provided one.

When to use

Use to test whether one BigDecimal is greater than or equal to another.

Signature

declare const isGreaterThanOrEqualTo: {
  (that: BigDecimal): (self: BigDecimal) => boolean;
  (self: BigDecimal, that: BigDecimal): boolean;
};

isInteger

Added in v2.0.0 Source

Checks whether a given BigDecimal is an integer.

When to use

Use to test whether a BigDecimal has no fractional decimal part.

Signature

declare function isInteger(n: BigDecimal): boolean;

isLessThan

Added in v4.0.0 Source

Returns true if the first argument is less than the second, otherwise false.

When to use

Use to test whether one BigDecimal is strictly less than another.

Signature

declare const isLessThan: {
  (that: BigDecimal): (self: BigDecimal) => boolean;
  (self: BigDecimal, that: BigDecimal): boolean;
};

Checks whether a given BigDecimal is less than or equal to the provided one.

When to use

Use to test whether one BigDecimal is less than or equal to another.

Signature

declare const isLessThanOrEqualTo: {
  (that: BigDecimal): (self: BigDecimal) => boolean;
  (self: BigDecimal, that: BigDecimal): boolean;
};

isNegative

Added in v2.0.0 Source

Checks whether a given BigDecimal is negative.

When to use

Use to test whether a BigDecimal is less than zero.

Signature

declare function isNegative(n: BigDecimal): boolean;

isPositive

Added in v2.0.0 Source

Checks whether a given BigDecimal is positive.

When to use

Use to test whether a BigDecimal is greater than zero.

Signature

declare function isPositive(n: BigDecimal): boolean;

isZero

Added in v2.0.0 Source

Checks whether a given BigDecimal is 0.

When to use

Use to test whether a BigDecimal is exactly zero.

Signature

declare function isZero(n: BigDecimal): boolean;

Scaling

normalize

Added in v2.0.0 Source

Normalizes a given BigDecimal by removing trailing zeros.

When to use

Use to canonicalize decimals that have equivalent values but different internal scales.

See

  • format for rendering normalized decimals as strings

Signature

declare function normalize(self: BigDecimal): BigDecimal;

scale

Added in v2.0.0 Source

Changes a BigDecimal to the specified scale.

When to use

Use to change how many decimal places are represented by a BigDecimal.

Details

Increasing the scale appends decimal zeros. Decreasing the scale discards digits beyond the target scale by bigint division, which truncates toward zero.

See

  • round for changing scale with configurable rounding

Signature

declare const scale: {
  (scale: number): (self: BigDecimal) => BigDecimal;
  (self: BigDecimal, scale: number): BigDecimal;
};