📜  红宝石 | BigDecimal + 值(1)

📅  最后修改于: 2023-12-03 15:27:28.352000             🧑  作者: Mango

Ruby BigDecimal类 介绍

简介

BigDecimal 是 Ruby 内置的用于浮点数计算的标准库。它可以提供更高的精度与更好的运算稳定性。

在普通的浮点数中,它们在进行计算时,可能会出现近似误差和精度损失。 而在 BigDecimal 中,我们可以设置精度,同时不会出现这些问题。

基本使用

BigDecimal 类的创建方式有多种,其中最常用的方法为传入一个字符串的形式来创建它。

require 'bigdecimal'
big_decimal = BigDecimal('3.1415926')

在这里,我们创建了一个精度为 16 位的 BigDecimal 对象并赋值 3.1415926

接下来,我们来看下“BigDecimal + 值”的使用。因为BigDecimal 是一种更高精度和更好的运算稳定性类,与其他基本类型的运算方式不同,需要先转换为 BigDecimal 再进行计算,即:

x = BigDecimal(10) # number 10
y = BigDecimal(0.3) # number 0.3
puts x + y # 10.3E0

如果要变为十进制的值,可以通过 to_sto_f 方法进行转换:

x = BigDecimal(10) # number 10
y = BigDecimal(0.3) # number 0.3
puts (x + y).to_s('F') # 10.3
puts (x + y).to_f # 10.3
精度设置

在使用 BigDecimal 时,我们可以通过 BigDecimal.mode 方法来设置精度:

require 'bigdecimal'
BigDecimal.mode(BigDecimal::ROUND_MODE, :up) # 设置四舍五入模式
BigDecimal.mode(BigDecimal::ROUND_UP)

在这里,BigDecimal::ROUND_MODE 表示我们要设置的选项名,:up 表示要设置的选项值,表示会执行向上舍入的操作。同理 BigDecimal::ROUND_UP 也可以达到相同的效果。

机器本身存在精度问题,我们可以通过以下方式设置 BigDecimal 的精度,以1除以3为例:

require 'bigdecimal'
y = 1 / 3r # 是有限小数,1/3约等于0.33333333333

x = BigDecimal(1) # number 1
d = BigDecimal(3) # number 3
BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_UP)
puts (x / d).to_s('F') # 0.333333E0

在这里,通过设定为 ROUND_HALF_UP 模式,精度为 9 ,我们得到了 0.333333E0 的结果。

链式调用

BigDecimal 还支持链式调用的形式,使用 +,-,*,/ 符号的方法既支持一次性计算,也支持链式调用:

a = BigDecimal(1.1) # number 1.1
b = BigDecimal(2.4) # number 2.4
result = BigDecimal('0') # number 0
result += a
result -= b
result /= BigDecimal('10')
puts result.to_s('F') # 每次运算结果为:0.1100000000, -2.2900000000,0.2290000000

在这里,我们使用了 +=-= 以及 /= 符号的方法,既可以一次性计算,又可以使用链式调用的方式。

总结

以上就是对于 Ruby 的 BigDecimal 类的详细介绍,我们可以根据实际需求选择对应的方法,从而达到所需的精度计算的目的。