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
¶
100_u64
TEN = BigInt.new(10)
¶
BigInt.new(10)
ZERO = BigInt.new(0)
¶
BigInt.new(0)
Class methods¶
.new(value : BigInt, scale : UInt64)
¶
(value : BigInt, scale : UInt64)
Creates a new BigDecimal from BigInt value and UInt64 scale,
which matches the internal representation.
.new(num : Float)
¶
(num : Float)
Creates a new BigDecimal from Float.
Note
Floats are fundamentally less precise than BigDecimals, which makes initialization from them risky.
.new(num : BigRational)
¶
(num : BigRational)
Creates a new BigDecimal from BigRational.
Note
BigRational are fundamentally more precise than BigDecimals, which makes initialization from them risky.
.new(num : BigDecimal)
¶
(num : BigDecimal)
Returns num. Useful for generic code that does T.new(...) with T
being a Number.
.new(str : String)
¶
(str : String)
Creates a new BigDecimal from a String.
Allows only valid number strings with an optional negative sign.
Methods¶
#**(other : Int) : BigDecimal
¶
(other : Int) : BigDecimal
Raises the decimal to the otherth power
require "big"
BigDecimal.new(1234, 2) ** 2 # => 152.2756
#<=>(other : BigDecimal) : Int32
¶
(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]
#==(other : BigDecimal) : Bool
¶
(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.
#div(other : BigDecimal, max_div_iterations = DEFAULT_MAX_DIV_ITERATIONS) : BigDecimal
¶
(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)
#hash(hasher)
¶
(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
#normalize_quotient(other : BigDecimal, quotient : BigInt) : BigInt
¶
(other : BigDecimal, quotient : BigInt) : BigInt
Returns the quotient as absolutely negative if self and other have
different signs, otherwise returns the quotient.
#scale_to(new_scale : BigDecimal) : BigDecimal
¶
(new_scale : BigDecimal) : BigDecimal
Scales a BigDecimal to another BigDecimal, so they can be
computed easier.
#to_big_i
¶
Converts to BigInt. Truncates anything on the right side of the decimal point.
#to_i
¶
Converts to Int32. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#to_i!
¶
Converts to Int32. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
#to_i16
¶
Converts to Int16. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#to_i16!
¶
Converts to Int16. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
#to_i32
¶
Converts to Int32. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#to_i32!
¶
Converts to Int32. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
#to_i64
¶
Converts to Int64. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#to_i64!
¶
Converts to Int64. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
#to_i8
¶
Converts to Int8. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#to_i8!
¶
Converts to Int8. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
#to_s(io : IO) : Nil
¶
(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.
#to_u
¶
Converts to UInt32. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#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.
#to_u16
¶
Converts to UInt16. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#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.
#to_u32
¶
Converts to UInt32. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#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.
#to_u64
¶
Converts to UInt64. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#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.
#to_u8
¶
Converts to UInt8. Truncates anything on the right side of the decimal point.
Raises OverflowError in case of overflow.
#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.