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
BigDecimalfromBigIntvalue andUInt64scale, which matches the internal representation. -
.new(num : Float)
Creates a new
BigDecimalfromFloat. -
.new(num : BigRational)
Creates a new
BigDecimalfromBigRational. -
.new(num : BigDecimal)
Returns num.
-
.new(num : Int = 0, scale : Int = 0)
Creates a new
BigDecimalfromInt. -
.new(str : String)
Creates a new
BigDecimalfrom 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, returningtrueif it returns0. - #ceil : BigDecimal
- #clone
-
#div(other : BigDecimal, max_div_iterations = DEFAULT_MAX_DIV_ITERATIONS) : BigDecimal
Divides
selfwith 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
selfand other have different signs, otherwise returns the quotient. - #scale : UInt64
-
#scale_to(new_scale : BigDecimal) : BigDecimal
Scales a
BigDecimalto 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(hasher)
hash hash, in?(*values : Object) : Bool
in?(collection) : Bool in?, inspect : String
inspect(io : IO) : Nil 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(io : IO, indent : String = " ")
to_pretty_json(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.
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.
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.
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.
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.
Raises OverflowError in case of overflow.