当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Ruby BigDecimal类用法及代码示例

本文简要介绍ruby语言中 BigDecimal类 的用法。

BigDecimal 提供arbitrary-precision 浮点十进制运算。

介绍

Ruby 提供了对任意精度整数运算的内置支持。

例如:

42**13  #=>   1265437718438866624512

BigDecimal 为非常大或非常精确的浮点数提供类似的支持。

十进制算术对于一般计算也很有用,因为它提供了正确的答案人们expect-whereas 正常的二进制浮点算术通常会因为基数 10 和基数 2 之间的转换而引入细微的错误。

例如,尝试:

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

并与以下输出进行对比:

require 'bigdecimal'

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

相似地:

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

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

关于精度的说明

对于使用 BigDecimal 和另一个 value 的计算,结果的精度取决于 value 的类型:

  • 如果 value 是浮点数,则精度为 Float::DIG + 1。

  • 如果 value 是 Rational,则精度大于 Float::DIG + 1。

  • 如果 value 是 BigDecimal,则精度是 value 在内部表示中的精度,这取决于平台。

  • 如果value为其他对象,则精度由+BigDecimal(value)+的结果决定。

精确十进制运算的特殊函数

因为 BigDecimal 比普通的二进制浮点运算更准确,所以它需要一些特殊的值。

无穷

BigDecimal 有时需要返回无穷大,例如,如果您将一个值除以零。

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

您可以使用字符串 'Infinity''+Infinity''-Infinity' (区分大小写)将无限数表示为 BigDecimal

不是数字

当计算得出未定义的值时,将返回特殊值 NaN(表示“非数字”)。

例子:

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

您还可以创建未定义的值。

NaN 永远不会被认为与任何其他值相同,即使是 NaN 本身:

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

正负零

如果计算导致的值太小而无法在当前指定的精度限制内表示为 BigDecimal ,则必须返回零。

如果太小而无法表示的值为负,则返回负零的 BigDecimal 值。

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

如果值为正,则返回正零值。

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

(有关如何指定精度限制,请参阅 BigDecimal.mode 。)

请注意,为了比较的目的,-0.00.0 被认为是相同的。

另请注意,在数学中,没有负零或正零的特定概念;真正的数学零没有符号。

大十进制/实用程序

当您需要 bigdecimal/util 时, to_d 方法将在 BigDecimal 和本机 Integer Float Rational String 类上可用:

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

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 BigDecimal类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。