本文简要介绍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类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。