W3cubDocs

/Crystal

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.cr
big/big_decimal.cr
big/number.cr

Constant Summary

DEFAULT_MAX_DIV_ITERATIONS = 100_u64
TEN = BigInt.new(10)
ZERO = BigInt.new(0)

Constructors

Instance Method Summary

Instance methods inherited from module Comparable(BigDecimal)

<, <=(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) >=, clamp(min, max)
clamp(range : Range) clamp

Instance methods inherited from module Comparable(Float)

<, <=(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) >=, 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) >=, clamp(min, max)
clamp(range : Range) clamp

Instance methods inherited from module Comparable(Number)

<, <=(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

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 : Int)Source

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 : Int)Source

def -(other : BigDecimal) : BigDecimalSource

def -(other : Int)Source

def - : BigDecimalSource

def /(other : UInt16) : BigDecimalSource

def /(other : Float32) : BigDecimalSource

def /(other : UInt128) : BigDecimalSource

def /(other : Int128) : BigDecimalSource

def /(other : UInt64) : BigDecimalSource

def /(other : Int64) : BigDecimalSource

def /(other : UInt32) : BigDecimalSource

def /(other : Int32) : BigDecimalSource

def /(other : Int16) : BigDecimalSource

def /(other : UInt8) : BigDecimalSource

def /(other : Int8) : BigDecimalSource

def /(other : BigRational) : BigRationalSource

def /(other : BigFloat) : BigDecimalSource

def /(other : BigInt) : BigDecimalSource

def /(other : BigDecimal) : BigDecimalSource

def /(other : Float64) : BigDecimalSource

def <=>(other : BigDecimal) : Int32Source

Description copied from module Comparable(BigDecimal)

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]

def <=>(other : Int | Float | BigRational)Source

def ==(other : BigDecimal) : BoolSource

Description copied from module Comparable(BigDecimal)

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

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

def hash(hasher)Source

Description copied from class Object

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 scale : UInt64Source

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_fSource

Converts to BigFloat.

def to_big_iSource

Converts to BigInt. Truncates anything on the right side of the decimal point.

def to_big_rSource

def to_fSource

Converts to Float64. Raises OverflowError in case of overflow.

def to_f!Source

Converts to Float64. In case of overflow a wrapping is performed.

def to_f32Source

Converts to Float32. Raises OverflowError in case of overflow.

def to_f32!Source

Converts to Float32. In case of overflow a wrapping is performed.

def to_f64Source

Converts to Float64. Raises OverflowError in case of overflow.

def to_f64!Source

Converts to Float64. In case of overflow a wrapping is performed.

def to_iSource

Converts to Int32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

def to_i!Source

Converts to Int32. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

def to_i16Source

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_i32Source

Converts to Int32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

def to_i32!Source

Converts to Int32. Truncates anything on the right side of the decimal point. In case of overflow a wrapping is performed.

def to_i64Source

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_i8Source

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_s(io : IO) : NilSource

Description copied from class Object

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.

def to_uSource

Converts to UInt32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

def to_u!Source

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_u16Source

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_u32Source

Converts to UInt32. Truncates anything on the right side of the decimal point. Raises OverflowError in case of overflow.

def to_u32!Source

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_u64Source

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_u8Source

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

def value : BigIntSource

© 2012–2020 Manas Technology Solutions.
Licensed under the Apache License, Version 2.0.
https://crystal-lang.org/api/0.35.1/BigDecimal.html