Skip to content

struct BigDecimal
inherits Number

A BigDecimal can represent arbitrarily large precision decimals.

It is internally represented by a pair of BigInt and UInt64: value and scale. Value contains the actual value, and scale tells the decimal point place. E.g. when value is 1234 and scale 2, the result is 12.34.

The general idea and some of the arithmetic algorithms were adapted from the MIT/APACHE-licensed bigdecimal-rs.

Included modules

Comparable Comparable Comparable Comparable

Constants

DEFAULT_MAX_DIV_ITERATIONS = 100_u64

TEN = BigInt.new(10)

ZERO = BigInt.new(0)

Class methods

.new(value : BigInt, scale : UInt64)

Creates a new BigDecimal from BigInt value and UInt64 scale, which matches the internal representation.

View source

.new(num : Float)

Creates a new BigDecimal from Float.

Note

Floats are fundamentally less precise than BigDecimals, which makes initialization from them risky.

View source

.new(num : BigRational)

Creates a new BigDecimal from BigRational.

Note

BigRational are fundamentally more precise than BigDecimals, which makes initialization from them risky.

View source

.new(num : BigDecimal)

Returns num. Useful for generic code that does T.new(...) with T being a Number.

View source

.new(num : Int = 0, scale : Int = 0)

Creates a new BigDecimal from Int.

View source

.new(str : String)

Creates a new BigDecimal from a String.

Allows only valid number strings with an optional negative sign.

View source

Methods

#*(other : Int)

View source

#**(other : Int) : BigDecimal

Raises the decimal to the otherth power

require "big"

BigDecimal.new(1234, 2) ** 2 # => 152.2756
View source

#+(other : Int)

View source

#-(other : Int)

View source

#/(other : Int64) : BigDecimal

View source

#/(other : Int32) : BigDecimal

View source

#/(other : Int16) : BigDecimal

View source

#/(other : UInt8) : BigDecimal

View source

#/(other : Int8) : BigDecimal

View source

#<=>(other : BigDecimal) : Int32

The comparison operator. Returns 0 if the two objects are equal, a negative number if this object is considered less than other, a positive number if this object is considered greater than other, or nil if the two objects are not comparable.

Subclasses define this method to provide class-specific ordering.

The comparison operator is usually used to sort values:

# Sort in a descending way:
[3, 1, 2].sort { |x, y| y <=> x } # => [3, 2, 1]

# Sort in an ascending way:
[3, 1, 2].sort { |x, y| x <=> y } # => [1, 2, 3]
View source

#<=>(other : Int | Float | BigRational)

View source

#==(other : BigDecimal) : Bool

Compares this object to other based on the receiver’s <=> method, returning true if it returns 0.

Also returns true if this and other are the same object.

View source

#clone

View source

#div(other : BigDecimal, max_div_iterations = DEFAULT_MAX_DIV_ITERATIONS) : BigDecimal

Divides self with another BigDecimal, with a optionally configurable max_div_iterations, which defines a maximum number of iterations in case the division is not exact.

BigDecimal.new(1).div(BigDecimal.new(2))    # => BigDecimal(@value=5, @scale=2)
BigDecimal.new(1).div(BigDecimal.new(3), 5) # => BigDecimal(@value=33333, @scale=5)
View source

#hash(hasher)

Appends this object's value to hasher, and returns the modified hasher.

Usually the macro def_hash can be used to generate this method. Otherwise, invoke hash(hasher) on each object's instance variables to accumulate the result:

def hash(hasher)
  hasher = @some_ivar.hash(hasher)
  hasher = @some_other_ivar.hash(hasher)
  hasher
end
View source

#normalize_quotient(other : BigDecimal, quotient : BigInt) : BigInt

Returns the quotient as absolutely negative if self and other have different signs, otherwise returns the quotient.

View source

#scale : UInt64

View source

#scale_to(new_scale : BigDecimal) : BigDecimal

Scales a BigDecimal to another BigDecimal, so they can be computed easier.

View source

#to_big_d

View source

#to_big_f

Converts to BigFloat.

View source

#to_big_i

Converts to BigInt. Truncates anything on the right side of the decimal point.

View source

#to_big_r

View source

#to_f

Converts to Float64. Raises OverflowError in case of overflow.

View source

#to_f!

Converts to Float64. In case of overflow a wrapping is performed.

View source

#to_f32

Converts to Float32. Raises OverflowError in case of overflow.

View source

#to_f32!

Converts to Float32. In case of overflow a wrapping is performed.

View source

#to_f64

Converts to Float64. Raises OverflowError in case of overflow.

View source

#to_f64!

Converts to Float64. In case of overflow a wrapping is performed.

View source

#to_i

Converts to Int32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_i!

Converts to Int32. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

View source

#to_i16

Converts to Int16. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_i16!

Converts to Int16. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

View source

#to_i32

Converts to Int32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_i32!

Converts to Int32. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

View source

#to_i64

Converts to Int64. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_i64!

Converts to Int64. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

View source

#to_i8

Converts to Int8. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_i8!

Converts to Int8. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

View source

#to_s(io : IO) : Nil

Appends a String representation of this object to the given IO object.

An object must never append itself to the io argument, as this will in turn call to_s(io) on it.

View source

#to_u

Converts to UInt32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_u!

Converts to UInt32. Truncates anything on the right side of the decimal point, converting negative to positive. In case of overflow a wrapping is performed.

View source

#to_u16

Converts to UInt16. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_u16!

Converts to UInt16. Truncates anything on the right side of the decimal point, converting negative to positive. In case of overflow a wrapping is performed.

View source

#to_u32

Converts to UInt32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_u32!

Converts to UInt32. Truncates anything on the right side of the decimal point, converting negative to positive. In case of overflow a wrapping is performed.

View source

#to_u64

Converts to UInt64. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_u64!

Converts to UInt64. Truncates anything on the right side of the decimal point, converting negative to positive. In case of overflow a wrapping is performed.

View source

#to_u8

Converts to UInt8. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

View source

#to_u8!

Converts to UInt8. Truncates anything on the right side of the decimal point, converting negative to positive. In case of overflow a wrapping is performed.

View source

#value : BigInt

View source