struct BigDecimal
Overview
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
Defined in:
big.crbig/big_decimal.cr
big/number.cr
Constant Summary
- DEFAULT_MAX_DIV_ITERATIONS =
100_u64
- TEN =
BigInt.new(10)
- ZERO =
BigInt.new(0)
Constructors
- .new(value : BigInt, scale : UInt64)
Creates a new
BigDecimal
fromBigInt
value andUInt64
scale, which matches the internal representation. - .new(num : Float)
Creates a new
BigDecimal
fromFloat
. - .new(num : BigRational)
Creates a new
BigDecimal
fromBigRational
. - .new(num : BigDecimal)
Returns num.
- .new(num : Int = 0, scale : Int = 0)
Creates a new
BigDecimal
fromInt
. - .new(str : String)
Creates a new
BigDecimal
from aString
.
Instance Method Summary
- #*(other : BigDecimal) : BigDecimal
- #*(other : Number) : BigDecimal
- #**(other : Int) : BigDecimal
Raises the decimal to the otherth power
- #+(other : BigDecimal) : BigDecimal
- #+(other : Number) : BigDecimal
- #-(other : BigDecimal) : BigDecimal
- #-(other : Number) : BigDecimal
- #- : BigDecimal
- #/(other : BigDecimal) : BigDecimal
- #/(other : BigInt) : BigDecimal
- #/(other : BigFloat) : BigDecimal
- #/(other : BigRational) : BigRational
- #/(other : Int8) : BigDecimal
- #/(other : UInt8) : BigDecimal
- #/(other : Int16) : BigDecimal
- #/(other : UInt16) : BigDecimal
- #/(other : Int32) : BigDecimal
- #/(other : UInt32) : BigDecimal
- #/(other : Int64) : BigDecimal
- #/(other : UInt64) : BigDecimal
- #/(other : Int128) : BigDecimal
- #/(other : UInt128) : BigDecimal
- #/(other : Float32) : BigDecimal
- #/(other : Float64) : BigDecimal
- #<=>(other : BigDecimal) : Int32
The comparison operator.
- #<=>(other : Int | Float | BigRational)
- #==(other : BigDecimal) : Bool
Compares this object to other based on the receiver’s
#<=>
method, returningtrue
if it returns0
. - #ceil : BigDecimal
Rounds towards positive infinity.
- #clone
- #div(other : BigDecimal, max_div_iterations = DEFAULT_MAX_DIV_ITERATIONS) : BigDecimal
Divides
self
with anotherBigDecimal
, with a optionally configurable max_div_iterations, which defines a maximum number of iterations in case the division is not exact. - #floor : BigDecimal
Rounds towards negative infinity.
- #hash(hasher)
Appends this object's value to hasher, and returns the modified hasher.
- #normalize_quotient(other : BigDecimal, quotient : BigInt) : BigInt
Returns the quotient as absolutely negative if
self
and other have different signs, otherwise returns the quotient. - #round(digits : Number, base = 10, *, mode : RoundingMode = :ties_even) : BigDecimal
Rounds this number to a given precision.
- #round_away : BigDecimal
Rounds towards the nearest integer.
- #round_even : BigDecimal
Rounds towards the nearest integer.
- #scale : UInt64
- #scale_to(new_scale : BigDecimal) : BigDecimal
Scales a
BigDecimal
to anotherBigDecimal
, so they can be computed easier. - #to_big_d
- #to_big_f
Converts to
BigFloat
. - #to_big_i : BigInt
Converts to
BigInt
. - #to_big_r : BigRational
- #to_f : Float64
Converts to
Float64
. - #to_f! : Float64
Converts to
Float64
. - #to_f32 : Float32
Converts to
Float32
. - #to_f32!
Converts to
Float32
. - #to_f64 : Float64
Converts to
Float64
. - #to_f64! : Float64
Converts to
Float64
. - #to_i : Int32
Converts to
Int32
. - #to_i! : Int32
Converts to
Int32
. - #to_i16 : Int16
Converts to
Int16
. - #to_i16!
Converts to
Int16
. - #to_i32 : Int32
Converts to
Int32
. - #to_i32! : Int32
Converts to
Int32
. - #to_i64 : Int64
Converts to
Int64
. - #to_i64!
Converts to
Int64
. - #to_i8 : Int8
Converts to
Int8
. - #to_i8!
Converts to
Int8
. - #to_s(io : IO) : Nil
- #to_u : UInt32
Converts to
UInt32
. - #to_u! : UInt32
Converts to
UInt32
. - #to_u16 : UInt16
Converts to
UInt16
. - #to_u16!
Converts to
UInt16
. - #to_u32 : UInt32
Converts to
UInt32
. - #to_u32! : UInt32
Converts to
UInt32
. - #to_u64 : UInt64
Converts to
UInt64
. - #to_u64!
Converts to
UInt64
. - #to_u8 : UInt8
Converts to
UInt8
. - #to_u8!
Converts to
UInt8
. - #trunc : BigDecimal
Rounds towards zero.
- #value : BigInt
- #zero? : Bool
Returns
true
ifself
is equal to zero.
Instance methods inherited from module Comparable(BigDecimal)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(BigRational)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(Float)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(Int)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from struct Number
*(other : BigFloat) : BigFloat*(other : Complex) : Complex *, +(other : BigFloat)
+(other : Complex) : Complex
+ +, -(other : BigFloat)
-(other : Complex) : Complex -, /(other : BigFloat) : BigFloat
/(other : Complex) : Complex /, //(other) //, <=>(other : BigFloat)
<=>(other) : Int32? <=>, ==(other : Complex) ==, abs : self abs, abs2 abs2, cis : Complex cis, divmod(number) divmod, format(io : IO, separator = '.', delimiter = ',', decimal_places : Int? = nil, *, group : Int = 3, only_significant : Bool = false) : Nil
format(separator = '.', delimiter = ',', decimal_places : Int? = nil, *, group : Int = 3, only_significant : Bool = false) : String format, humanize(io : IO, precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Indexable = SI_PREFIXES) : Nil
humanize(io : IO, precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Proc) : Nil
humanize(precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes = SI_PREFIXES) : String
humanize(io : IO, precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, &prefixes : Int32, Float64 -> Tuple(Int32, _) | Tuple(Int32, _, Bool)) : Nil
humanize(precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, &) : String
humanize(precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Proc) : String humanize, i : Complex i, negative? : Bool negative?, positive? : Bool positive?, round(mode : RoundingMode = :ties_even) : self
round(digits : Number, base = 10, *, mode : RoundingMode = :ties_even) round, sign : Int32 sign, significant(digits, base = 10) significant, step(*, to limit = nil, exclusive : Bool = false, &) : Nil
step(*, to limit = nil, exclusive : Bool = false) step, to_big_f : BigFloat to_big_f, to_c : Complex to_c, to_yaml(yaml : YAML::Nodes::Builder) : Nil to_yaml, zero? : Bool zero?
Constructor methods inherited from struct Number
additive_identity : self additive_identity, multiplicative_identity : self multiplicative_identity, zero : self zero Class methods inherited from struct Number
si_prefix(magnitude : Int, prefixes = SI_PREFIXES) : Char? si_prefix Instance methods inherited from module Comparable(BigFloat)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Steppable
step(*, to limit = nil, by step, exclusive : Bool = false, &) : Nilstep(*, to limit = nil, by step, exclusive : Bool = false) step
Instance methods inherited from module Comparable(Number)
<, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) : Bool >, >=(other : T) >=, clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from struct Value
==(other : JSON::Any)==(other : YAML::Any)
==(other) ==, dup dup
Instance methods inherited from class Object
! : Bool !, !=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash(hasher)
hash hash, in?(collection : Object) : Bool
in?(*values : Object) : Bool in?, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO) : Nil
to_json : String to_json, to_pretty_json(indent : String = " ") : String
to_pretty_json(io : IO, indent : String = " ") : Nil to_pretty_json, to_s(io : IO) : Nil
to_s : String to_s, to_yaml(io : IO) : Nil
to_yaml : String to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as
Class methods inherited from class Object
from_json(string_or_io, root : String)from_json(string_or_io) from_json, from_yaml(string_or_io : String | IO) from_yaml
Constructor Detail
def self.new(value : BigInt, scale : UInt64)Source
Creates a new BigDecimal
from BigInt
value and UInt64
scale, which matches the internal representation.
def self.new(num : Float)Source
Creates a new BigDecimal
from Float
.
NOTE Floats are fundamentally less precise than BigDecimals, which makes initialization from them risky.
def self.new(num : BigRational)Source
Creates a new BigDecimal
from BigRational
.
NOTE BigRational are fundamentally more precise than BigDecimals, which makes initialization from them risky.
def self.new(num : BigDecimal)Source
Returns num. Useful for generic code that does T.new(...)
with T
being a Number
.
def self.new(num : Int = 0, scale : Int = 0)Source
Creates a new BigDecimal
from Int
.
def self.new(str : String)Source
Creates a new BigDecimal
from a String
.
Allows only valid number strings with an optional negative sign.
Instance Method Detail
def *(other : BigDecimal) : BigDecimalSource
def *(other : Number) : BigDecimalSource
def **(other : Int) : BigDecimalSource
Raises the decimal to the otherth power
require "big" BigDecimal.new(1234, 2) ** 2 # => 152.2756
def +(other : BigDecimal) : BigDecimalSource
def +(other : Number) : BigDecimalSource
def -(other : BigDecimal) : BigDecimalSource
def -(other : Number) : BigDecimalSource
def - : BigDecimalSource
def /(other : BigDecimal) : BigDecimalSource
def /(other : BigInt) : BigDecimalSource
def /(other : BigFloat) : BigDecimalSource
def /(other : BigRational) : BigRationalSource
def /(other : Int8) : BigDecimalSource
def /(other : UInt8) : BigDecimalSource
def /(other : Int16) : BigDecimalSource
def /(other : UInt16) : BigDecimalSource
def /(other : Int32) : BigDecimalSource
def /(other : UInt32) : BigDecimalSource
def /(other : Int64) : BigDecimalSource
def /(other : UInt64) : BigDecimalSource
def /(other : Int128) : BigDecimalSource
def /(other : UInt128) : BigDecimalSource
def /(other : Float32) : BigDecimalSource
def /(other : Float64) : BigDecimalSource
def <=>(other : BigDecimal) : Int32Source
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]
def <=>(other : Int | Float | BigRational)Source
def ==(other : BigDecimal) : BoolSource
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.
def ceil : BigDecimalSource
Rounds towards positive infinity.
def cloneSource
def div(other : BigDecimal, max_div_iterations = DEFAULT_MAX_DIV_ITERATIONS) : BigDecimalSource
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)
def floor : BigDecimalSource
Rounds towards negative infinity.
def hash(hasher)Source
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
def normalize_quotient(other : BigDecimal, quotient : BigInt) : BigIntSource
Returns the quotient as absolutely negative if self
and other have different signs, otherwise returns the quotient.
def round(digits : Number, base = 10, *, mode : RoundingMode = :ties_even) : BigDecimalSource
Rounds this number to a given precision.
Rounds to the specified number of digits after the decimal place, (or before if negative), in base base.
The rounding mode controls the direction of the rounding. The default is RoundingMode::TIES_EVEN
which rounds to the nearest integer, with ties (fractional value of 0.5
) being rounded to the even neighbor (Banker's rounding).
-1763.116.round(2) # => -1763.12
def round_away : BigDecimalSource
Rounds towards the nearest integer. If both neighboring integers are equidistant, rounds away from zero.
def round_even : BigDecimalSource
Rounds towards the nearest integer. If both neighboring integers are equidistant, rounds towards the even neighbor (Banker's rounding).
def scale_to(new_scale : BigDecimal) : BigDecimalSource
Scales a BigDecimal
to another BigDecimal
, so they can be computed easier.
def to_big_dSource
def to_big_i : BigIntSource
Converts to BigInt
. Truncates anything on the right side of the decimal point.
def to_big_r : BigRationalSource
def to_f : Float64Source
Converts to Float64
. Raises OverflowError
in case of overflow.
def to_f32 : Float32Source
Converts to Float32
. Raises OverflowError
in case of overflow.
def to_f64 : Float64Source
Converts to Float64
. Raises OverflowError
in case of overflow.
def to_i : Int32Source
Converts to Int32
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_i! : Int32Source
Converts to Int32
. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.
def to_i16 : Int16Source
Converts to Int16
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_i16!Source
Converts to Int16
. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.
def to_i32 : Int32Source
Converts to Int32
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_i32! : Int32Source
Converts to Int32
. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.
def to_i64 : Int64Source
Converts to Int64
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_i64!Source
Converts to Int64
. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.
def to_i8 : Int8Source
Converts to Int8
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_i8!Source
Converts to Int8
. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.
def to_u : UInt32Source
Converts to UInt32
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_u! : UInt32Source
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.
def to_u16 : UInt16Source
Converts to UInt16
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_u16!Source
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.
def to_u32 : UInt32Source
Converts to UInt32
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_u32! : UInt32Source
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.
def to_u64 : UInt64Source
Converts to UInt64
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_u64!Source
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.
def to_u8 : UInt8Source
Converts to UInt8
. Truncates anything on the right side of the decimal point. Raises OverflowError
in case of overflow.
def to_u8!Source
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.
def trunc : BigDecimalSource
Rounds towards zero.
def zero? : BoolSource
Returns true
if self
is equal to zero.
0.zero? # => true 5.zero? # => false
© 2012–2021 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/1.2.1/BigDecimal.html