Skip to content
On this page

End of Life Ruby 3.1 has reached end of life and gets no more fixes. Switch to Ruby 4.0 →

class · Ruby 3.1

BigDecimal

< Numeric 61 instance methods 9 class methods

BigDecimal provides arbitrary-precision floating point decimal arithmetic.

Introduction

Ruby provides built-in support for arbitrary precision integer arithmetic.

For example:

Example
42**13  #=>   1265437718438866624512

BigDecimal provides similar support for very large or very accurate floating point numbers.

Decimal arithmetic is also useful for general calculation, because it provides the correct answers people expect–whereas normal binary floating point arithmetic often introduces subtle errors because of the conversion between base 10 and base 2.

For example, try:

Example
sum = 0
10_000.times do
  sum = sum + 0.0001
end
print sum #=> 0.9999999999999062

and contrast with the output from:

Example
require 'bigdecimal'

sum = BigDecimal("0")
10_000.times do
  sum = sum + BigDecimal("0.0001")
end
print sum #=> 0.1E1

Similarly:

Example
(BigDecimal("1.2") - BigDecimal("1.0")) == BigDecimal("0.2") #=> true

(1.2 - 1.0) == 0.2 #=> false

A Note About Precision

For a calculation using a BigDecimal and another value, the precision of the result depends on the type of value:

  • If value is a Float, the precision is Float::DIG + 1.

  • If value is a Rational, the precision is larger than Float::DIG + 1.

  • If value is a BigDecimal, the precision is value‘s precision in the internal representation, which is platform-dependent.

  • If value is other object, the precision is determined by the result of +BigDecimal(value)+.

Special features of accurate decimal arithmetic

Because BigDecimal is more accurate than normal binary floating point arithmetic, it requires some special values.

Infinity

BigDecimal sometimes needs to return infinity, for example if you divide a value by zero.

Example
BigDecimal("1.0") / BigDecimal("0.0")  #=> Infinity
BigDecimal("-1.0") / BigDecimal("0.0")  #=> -Infinity

You can represent infinite numbers to BigDecimal using the strings 'Infinity', '+Infinity' and '-Infinity' (case-sensitive)

Not a Number

When a computation results in an undefined value, the special value NaN (for ‘not a number’) is returned.

Example:

Example
BigDecimal("0.0") / BigDecimal("0.0") #=> NaN

You can also create undefined values.

NaN is never considered to be the same as any other value, even NaN itself:

Example
n = BigDecimal('NaN')
n == 0.0 #=> false
n == n #=> false

Positive and negative zero

If a computation results in a value which is too small to be represented as a BigDecimal within the currently specified limits of precision, zero must be returned.

If the value which is too small to be represented is negative, a BigDecimal value of negative zero is returned.

Example
BigDecimal("1.0") / BigDecimal("-Infinity") #=> -0.0

If the value is positive, a value of positive zero is returned.

Example
BigDecimal("1.0") / BigDecimal("Infinity") #=> 0.0

(See BigDecimal.mode for how to specify limits of precision.)

Note that -0.0 and 0.0 are considered to be the same for the purposes of comparison.

Note also that in mathematics, there is no particular concept of negative or positive zero; true mathematical zero has no sign.

bigdecimal/util

When you require bigdecimal/util, the to_d method will be available on BigDecimal and the native Integer, Float, Rational, and String classes:

Example
require 'bigdecimal/util'

42.to_d         # => 0.42e2
0.5.to_d        # => 0.5e0
(2/3r).to_d(3)  # => 0.667e0
"0.5".to_d      # => 0.5e0

License

Copyright © 2002 by Shigeo Kobayashi <[email protected]>.

BigDecimal is released under the Ruby and 2-clause BSD licenses. See LICENSE.txt for details.

Maintained by mrkn <[email protected]> and ruby-core members.

Documented by zzak <[email protected]>, mathew <[email protected]>, and many other contributors.

Class methods 9

Instance methods 61

Constants

Base value used in internal calculations. On a 32 bit system, BASE is 10000, indicating that calculation is done in groups of 4 digits. (If it were larger, BASE**2 wouldn’t fit in 32 bits, so you couldn’t guarantee that two groups could always be multiplied together without overflow.)

Determines whether overflow, underflow or zero divide result in an exception being thrown. See BigDecimal.mode.

Determines what happens when the result of a computation is infinity. See BigDecimal.mode.

Determines what happens when the result of a computation is not a number (NaN). See BigDecimal.mode.

Determines what happens when the result of a computation is an overflow (a result too large to be represented). See BigDecimal.mode.

Determines what happens when the result of a computation is an underflow (a result too small to be represented). See BigDecimal.mode.

Determines what happens when a division by zero is performed. See BigDecimal.mode.

Special value constants

NAN

No documentation available

Round towards +Infinity. See BigDecimal.mode.

Indicates that values should be rounded towards zero. See BigDecimal.mode.

Round towards -Infinity. See BigDecimal.mode.

Indicates that digits >= 6 should be rounded up, others rounded down. See BigDecimal.mode.

Round towards the even neighbor. See BigDecimal.mode.

Indicates that digits >= 5 should be rounded up, others rounded down. See BigDecimal.mode.

Determines what happens when a result must be rounded in order to fit in the appropriate number of significant digits. See BigDecimal.mode.

Indicates that values should be rounded away from zero. See BigDecimal.mode.

Indicates that a value is not a number. See BigDecimal.sign.

Indicates that a value is negative and finite. See BigDecimal.sign.

Indicates that a value is negative and infinite. See BigDecimal.sign.

Indicates that a value is -0. See BigDecimal.sign.

Indicates that a value is positive and finite. See BigDecimal.sign.

Indicates that a value is positive and infinite. See BigDecimal.sign.

Indicates that a value is +0. See BigDecimal.sign.

The version of bigdecimal library