當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。