📜  红宝石 | BigDecimal 值(1)

📅  最后修改于: 2023-12-03 14:56:46.320000             🧑  作者: Mango

红宝石 | BigDecimal 值

简介

BigDecimal 是 Ruby 标准库中的一个类,它提供了高精度的浮点数运算。在对于精度要求较高的计算场景中,使用 BigDecimal 可以避免因 JavaScript 中浮点数精度缺失而造成的计算错误。

Ruby 社区的许多重要项目,如 Ruby on Rails 框架,都需要 BigDecimal 来确保计算精度。

用法
创建 BigDecimal 对象

可以使用 BigDecimal() 方法来创建 BigDecimal 对象,它接受一个字符串类型的参数:

require 'bigdecimal'

num_str = '12345678901234567890.12345'
num = BigDecimal(num_str)

还可以使用 BigDecimal() 方法的块形式,其返回值即为 BigDecimal 对象:

require 'bigdecimal'

num = BigDecimal.new('123.45') {|n| n.scale = 10 }
运算

BigDecimal 对象可以进行基本的数学运算,包括 +-*/ 等。需要注意的是,由于 BigDecimal 是高精度的浮点数类型,其运算速度相对较慢。

require 'bigdecimal'

a = BigDecimal('2.0')
b = BigDecimal('1.1')

c = a + b
d = a - b
e = a * b
f = a / b

puts c
puts d
puts e
puts f

输出结果为:

3.1
0.9
2.20E+0
1.81818181818181818181E+0

需要注意的是,BigDecimal 对象的默认输出形式为科学计数法(如 2.20E+0),可以使用类似 to_s("F") 的方法来指定输出格式。

比较

使用 ==!=>>=<<= 这些运算符可以进行 BigDecimal 对象的比较。需要注意的是,在比较过程中 BigDecimal 对象的精度可能会被截断,因此在进行比较时需要格外小心。

require 'bigdecimal'

a = BigDecimal('2.0')
b = BigDecimal('1.9999')

puts a == b   # false
puts a > b    # true
puts a < b    # false
数学函数

BigDecimal 对象提供了多种数学函数,如 sqrtexplogsincos 等,可以帮助我们进行复杂的高精度计算。

require 'bigdecimal'

a = BigDecimal('2.0')

b = a ** 3      # 等价于 a*a*a
c = a.sqrt(10)  # 平方根,保留小数点后 10 位
d = a.log10     # 对数
e = a.exp       # 指数函数
f = BigDecimal::PI.cos

puts b
puts c
puts d
puts e
puts f
格式化

可以使用 to_s 方法来获取 BigDecimal 对象的字符串表示形式。如果要自定义输出格式,可以使用 sprintf 格式化字符串,也可以使用 truncate 方法来截取小数位数。

require 'bigdecimal'

a = BigDecimal('2.0')

puts a.to_s      # "0.2E1"
puts a.to_s('F') # "2.00000000000000000000E0"
puts sprintf("%.2f", a)     # "2.00"
puts a.truncate(3)          # #<BigDecimal:7f90239412b8,'0.2E1',18(36)>
puts a.truncate(3).to_s('F') # "2.000"
总结

BigDecimal 类提供了高精度的浮点数计算功能,是 Ruby 标准库中非常重要的一个类。在需要精确计算的场景中,使用 BigDecimal 可以避免因浮点数精度问题而造成的计算错误。需要注意的是,BigDecimal 的运算速度相对较慢,应该在选择使用时慎重考虑。

参考链接: