本文簡要介紹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.0
和0.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 BigDecimal.self >用法及代碼示例
- Ruby BigDecimal.self >=用法及代碼示例
- Ruby BigDecimal.floor用法及代碼示例
- Ruby BigDecimal.to_s用法及代碼示例
- Ruby BigDecimal.to_d用法及代碼示例
- Ruby BigDecimal.save_rounding_mode用法及代碼示例
- Ruby BigDecimal modulo用法及代碼示例
- Ruby BigDecimal infinite?用法及代碼示例
- Ruby BigDecimal.to_digits用法及代碼示例
- Ruby BigDecimal.add用法及代碼示例
- Ruby BigDecimal.save_exception_mode用法及代碼示例
- Ruby BigDecimal to_f()用法及代碼示例
- Ruby BigDecimal to_r()用法及代碼示例
- Ruby BigDecimal exponent用法及代碼示例
- Ruby BigDecimal.ceil用法及代碼示例
- Ruby BigDecimal log()用法及代碼示例
- Ruby BigDecimal sub()用法及代碼示例
- Ruby BigDecimal sin()用法及代碼示例
- Ruby BigDecimal.scale用法及代碼示例
- Ruby BigDecimal to_int()用法及代碼示例
- Ruby BigDecimal.truncate用法及代碼示例
- Ruby BigDecimal to_d()用法及代碼示例
- Ruby BigDecimal PI()用法及代碼示例
- Ruby BigDecimal truncate()用法及代碼示例
- Ruby BigDecimal zero?()用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 BigDecimal類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。