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.