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 : Int)
-
#**(other : Int) : BigDecimal
Raises the decimal to the otherth power
- #+(other : BigDecimal) : BigDecimal
- #+(other : Int)
- #-(other : BigDecimal) : BigDecimal
- #-(other : Int)
- #- : BigDecimal
- #/(other : UInt16) : BigDecimal
- #/(other : Float32) : BigDecimal
- #/(other : UInt128) : BigDecimal
- #/(other : Int128) : BigDecimal
- #/(other : UInt64) : BigDecimal
- #/(other : Int64) : BigDecimal
- #/(other : UInt32) : BigDecimal
- #/(other : Int32) : BigDecimal
- #/(other : Int16) : BigDecimal
- #/(other : UInt8) : BigDecimal
- #/(other : Int8) : BigDecimal
- #/(other : BigRational) : BigRational
- #/(other : BigFloat) : BigDecimal
- #/(other : BigInt) : BigDecimal
- #/(other : BigDecimal) : 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
- #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
-
#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. - #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
Converts to
BigInt
. - #to_big_r
-
#to_f
Converts to
Float64
. -
#to_f!
Converts to
Float64
. -
#to_f32
Converts to
Float32
. -
#to_f32!
Converts to
Float32
. -
#to_f64
Converts to
Float64
. -
#to_f64!
Converts to
Float64
. -
#to_i
Converts to
Int32
. -
#to_i!
Converts to
Int32
. -
#to_i16
Converts to
Int16
. -
#to_i16!
Converts to
Int16
. -
#to_i32
Converts to
Int32
. -
#to_i32!
Converts to
Int32
. -
#to_i64
Converts to
Int64
. -
#to_i64!
Converts to
Int64
. -
#to_i8
Converts to
Int8
. -
#to_i8!
Converts to
Int8
. - #to_s(io : IO) : Nil
-
#to_u
Converts to
UInt32
. -
#to_u!
Converts to
UInt32
. -
#to_u16
Converts to
UInt16
. -
#to_u16!
Converts to
UInt16
. -
#to_u32
Converts to
UInt32
. -
#to_u32!
Converts to
UInt32
. -
#to_u64
Converts to
UInt64
. -
#to_u64!
Converts to
UInt64
. -
#to_u8
Converts to
UInt8
. -
#to_u8!
Converts to
UInt8
. - #trunc : BigDecimal
- #value : BigInt
Instance methods inherited from module Comparable(BigDecimal)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=,
clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(BigRational)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=,
clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(Float)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=,
clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(Int)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=,
clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from struct Number
*(other : Complex)*(other : BigFloat) *, +(other : BigFloat)
+(other : Complex)
+ +, -(other : Complex)
-(other : BigFloat) -, /(other : Complex)
/(other : BigFloat) /, //(other) //, <=>(other : BigFloat)
<=>(other) : Int32? <=>, ==(other : Complex) ==, abs abs, abs2 abs2, cis cis, divmod(number) divmod, format(separator = '.', delimiter = ',', decimal_places : Int? = nil, *, group : Int = 3, only_significant : Bool = false) : String
format(io : IO, separator = '.', delimiter = ',', decimal_places : Int? = nil, *, group : Int = 3, only_significant : Bool = false) : Nil format, humanize(io : IO, precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Indexable = SI_PREFIXES) : Nil
humanize(precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Proc) : Nil
humanize(precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, &) : 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, prefixes = SI_PREFIXES) : String
humanize(io : IO, precision = 3, separator = '.', delimiter = ',', *, base = 10 ** 3, significant = true, prefixes : Proc) : Nil humanize, i i, round(digits = 0, base = 10) round, sign sign, significant(digits, base = 10) significant, step(*, to = nil, by = 1)
step(*, to = nil, by = 1, &) step, to_big_f to_big_f, to_c to_c, to_yaml(yaml : YAML::Nodes::Builder) to_yaml, zero? : Bool zero?
Constructor methods inherited from struct Number
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)
==,
>(other : T)
>,
>=(other : T)
>=,
clamp(min, max)clamp(range : Range) clamp
Instance methods inherited from module Comparable(Number)
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(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
hash(hasher) hash, 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)
to_json to_json, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ") to_pretty_json, to_s : String
to_s(io : IO) : Nil to_s, to_yaml(io : IO)
to_yaml 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
Creates a new BigDecimal
from BigInt
value and UInt64
scale,
which matches the internal representation.
Creates a new BigDecimal
from Float
.
NOTE Floats are fundamentally less precise than BigDecimals, which makes initialization from them risky.
Creates a new BigDecimal
from BigRational
.
NOTE BigRational are fundamentally more precise than BigDecimals, which makes initialization from them risky.
Creates a new BigDecimal
from a String
.
Allows only valid number strings with an optional negative sign.
Instance Method Detail
Raises the decimal to the otherth power
require "big"
BigDecimal.new(1234, 2) ** 2 # => 152.2756
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 greter 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]
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.
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)
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
Returns the quotient as absolutely negative if self
and other have
different signs, otherwise returns the quotient.
Scales a BigDecimal
to another BigDecimal
, so they can be
computed easier.
Converts to Int32
. Truncates anything on the right side of the decimal point.
Raises OverflowError
in case of overflow.
Converts to Int32
. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
Converts to Int16
. Truncates anything on the right side of the decimal point.
Raises OverflowError
in case of overflow.
Converts to Int16
. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
Converts to Int32
. Truncates anything on the right side of the decimal point.
Raises OverflowError
in case of overflow.
Converts to Int32
. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
Converts to Int64
. Truncates anything on the right side of the decimal point.
Raises OverflowError
in case of overflow.
Converts to Int64
. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
Converts to Int8
. Truncates anything on the right side of the decimal point.
Raises OverflowError
in case of overflow.
Converts to Int8
. Truncates anything on the right side of the decimal point.
In case of overflow a wrapping is performed.
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.
Converts to UInt32
. Truncates anything on the right side of the decimal point,
converting negative to positive.
Raises OverflowError
in case of overflow.
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.
Converts to UInt16
. Truncates anything on the right side of the decimal point,
converting negative to positive.
Raises OverflowError
in case of overflow.
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.
Converts to UInt32
. Truncates anything on the right side of the decimal point,
converting negative to positive.
Raises OverflowError
in case of overflow.
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.
Converts to UInt64
. Truncates anything on the right side of the decimal point,
converting negative to positive.
Raises OverflowError
in case of overflow.
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.
Converts to UInt8
. Truncates anything on the right side of the decimal point,
converting negative to positive.
Raises OverflowError
in case of overflow.