# struct BigDecimal

- BigDecimal
- Number
- Value
- Object

## Included Modules

- Comparable(BigDecimal)
- Comparable(BigRational)
- Comparable(Float)
- Comparable(Int)

## Defined in:

## 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` from `BigInt` value and `UInt64` scale, which matches the internal representation.

- .new(num : Float)

  Creates a new `BigDecimal` from `Float`.

- .new(num : BigRational)

  Creates a new `BigDecimal` from `BigRational`.

- .new(num : BigDecimal)

  Returns num.

- .new(num : Int = 0, scale : Int = 0)

  Creates a new `BigDecimal` from `Int`.

- .new(str : String)

  Creates a new `BigDecimal` from a `String`.

## Instance Method Summary

- #*(other : BigDecimal) : BigDecimal
- #*(other : Int)
- #+(other : BigDecimal) : BigDecimal
- #+(other : Int)
- #-(other : BigDecimal) : BigDecimal
- #-(other : Int)
- #- : BigDecimal
- #/(other : BigDecimal) : BigDecimal
- #/(other : Int)
- #<=>(other : Int | Float | BigRational)
- #<=>(other : BigDecimal) : Int32
- #==(other : BigDecimal) : Bool
- #clone
- #div(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.

- #hash(hasher)
- #inspect(io)
- #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 another `BigDecimal`, so they can be computed easier.

- #to_big_d
- #to_big_f

  Converts to `BigFloat`.

- #to_f

  Converts to `Float64`.

- #to_f32

  Converts to `Float32`.

- #to_f64

  Converts to `Float64`.

- #to_i

  Converts to `Int32`.

- #to_i16

  Converts to `Int16`.

- #to_i32

  Converts to `Int32`.

- #to_i64

  Converts to `Int64`.

- #to_i8

  Converts to `Int8`.

- #to_s(io : IO)
- #to_u

  Converts to `UInt32`.

- #to_u16

  Converts to `UInt16`.

- #to_u32

  Converts to `UInt32`.

- #to_u64

  Converts to `UInt64`.

- #to_u8

  Converts to `UInt8`.

- #value : BigInt

### Instance methods inherited from module `Comparable(BigDecimal)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from module `Comparable(BigRational)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from module `Comparable(Float)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from module `Comparable(Int)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from struct `Number`

*(other : Complex)
*(other : BigFloat) *, +(other : BigFloat)
+(other : Complex)
+ +, -(other : Complex)
-(other : BigFloat) -, /(other : Complex)
/(other : BigFloat) /, <=>(other : BigFloat)
<=>(other) <=>, ==(other : Complex) ==, abs abs, abs2 abs2, cis cis, clamp(min, max)
clamp(range : Range) clamp, divmod(number) divmod, 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, &block) 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

### Instance methods inherited from module `Comparable(BigFloat)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from module `Comparable(Number)`

<(other : T) <, <=(other : T) <=, <=>(other : T) <=>, ==(other : T) ==, >(other : T) >, >=(other : T) >=

### Instance methods inherited from struct `Value`

==(other : JSON::Any)
==(other : YAML::Any)
==(other) ==, dup dup

### Instance methods inherited from class `Object`

!=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)
===(other : YAML::Any)
===(other) ===, =~(other) =~, class class, dup dup, hash(hasher)
hash hash, inspect(io : IO)
inspect inspect, itself itself, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, tap(&block) 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
to_s(io : IO) to_s, to_yaml(io : IO)
to_yaml to_yaml, try(&block) try, unsafe_as(type : T.class) forall T unsafe_as

### Constructor methods inherited from class `Object`

from_json(string_or_io, root : String) : self
from_json(string_or_io) : self from_json, from_yaml(string_or_io : String | IO) : self from_yaml

## Constructor Detail

def self.new(value : BigInt, scale : UInt64) #

Creates a new `BigDecimal` from `BigInt` value and `UInt64` scale, which matches the internal representation.

def self.new(num : Float) #

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) #

Creates a new `BigDecimal` from `BigRational`.

def self.new(num : BigDecimal) #

Returns num. Useful for generic code that does `T.new(...)` with `T` being a `Number`.

def self.new(num : Int = 0, scale : Int = 0) #

Creates a new `BigDecimal` from `Int`.

def self.new(str : String) #

Creates a new `BigDecimal` from a `String`.

Allows only valid number strings with an optional negative sign.

## Instance Method Detail

def *(other : BigDecimal) : BigDecimal #
def *(other : Int) #
def +(other : BigDecimal) : BigDecimal #
def +(other : Int) #
def -(other : BigDecimal) : BigDecimal #
def -(other : Int) #
def - : BigDecimal #
def /(other : BigDecimal) : BigDecimal #
def /(other : Int) #
def <=>(other : Int | Float | BigRational) #
def <=>(other : BigDecimal) : Int32 #
def ==(other : BigDecimal) : Bool #
def clone #
def div(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(1).div(BigDecimal(2))    # => BigDecimal(@value=5, @scale=2)
    BigDecimal(1).div(BigDecimal(3), 5) # => BigDecimal(@value=33333, @scale=5)

def hash(hasher) #
def inspect(io) #
def normalize_quotient(other : BigDecimal, quotient : BigInt) : BigInt #

Returns the quotient as absolutely negative if `self` and other have different signs, otherwise returns the quotient.

def scale : UInt64 #
def scale_to(new_scale : BigDecimal) : BigDecimal #

Scales a `BigDecimal` to another `BigDecimal`, so they can be computed easier.

def to_big_d #
def to_big_f #

Converts to `BigFloat`.

def to_f #

Converts to `Float64`.

def to_f32 #

Converts to `Float32`.

def to_f64 #

Converts to `Float64`.

def to_i #

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

def to_i16 #

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

def to_i32 #

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

def to_i64 #

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

def to_i8 #

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

def to_s(io : IO) #
def to_u #

Converts to `UInt32`. Truncates anything on the right side of the decimal point, converting negative to positive.

def to_u16 #

Converts to `UInt16`. Truncates anything on the right side of the decimal point, converting negative to positive.

def to_u32 #

Converts to `UInt32`. Truncates anything on the right side of the decimal point, converting negative to positive.

def to_u64 #

Converts to `UInt64`. Truncates anything on the right side of the decimal point, converting negative to positive.

def to_u8 #

Converts to `UInt8`. Truncates anything on the right side of the decimal point, converting negative to positive.

def value : BigInt #