Ruby中的操作顺序问题

Ruby中的操作顺序问题,ruby,operator-precedence,Ruby,Operator Precedence,我正在初始化一个类的实例,该类测试两个公式的相等性 公式的计算值实际上相等: RubyChem::Chemical.new("SOOS").fw => 96.0 RubyChem::Chemical.new("OSSO").fw = 96.0 当我创建一个新类来检查这两个实例的相等性时,我对结果感到有点惊讶: x = RubyChem::BalanceChem.new("SOOS","OSSO") x.balanced =>false y = RubyChem::Balance

我正在初始化一个类的实例,该类测试两个公式的相等性

公式的计算值实际上相等:

RubyChem::Chemical.new("SOOS").fw
=> 96.0

RubyChem::Chemical.new("OSSO").fw
= 96.0
当我创建一个新类来检查这两个实例的相等性时,我对结果感到有点惊讶:

x = RubyChem::BalanceChem.new("SOOS","OSSO")
x.balanced
=>false

y = RubyChem::BalanceChem.new("SOOS","SOOS")
y.balanced
=> true
RubyChem::BalanceChem初始化方法如下:

def initialize(formula1, formula2)
  @balanced = RubyChem::Chemical.new(formula1).fw == RubyChem::Chemical.new(formula2).fw
end

为什么ruby不获取公式1和公式2的fw值并检查这些值是否相等?Ruby中的操作顺序是什么?Ruby在做什么?我可以看出我对这个问题缺乏了解。我怎样才能做到这一点?提前感谢。

这可能是由以下原因引起的另一个问题

我可以向您保证,在计算等式之前计算的那些值


查看Ruby的

,您可能不想检查浮点数是否相等。相反,您应该比较增量

在irb中试试这个:

x = 1.000001
y = 1.0
x == y
(x-y).abs < 0.00001
x=1.000001
y=1.0
x==y
(x-y).绝对值<0.00001
因此,您可以找到一个类似于0.00001的增量,您认为它可以处理浮点运算中的任何变化,并以这种方式使用它。您永远不应该浮动。

Ruby 1.8有一个。有时,给定的字符串不是浮点的良好表示形式。下面是一个
0.56
的示例:

0.5600000000000005.to_s == 0.56.to_s  #=> true
# should have returned false, since:
0.5600000000000005      == 0.56       #=> false
这就解释了为什么两个明显相同的结果实际上并不相同


您可能希望在一定的误差范围内进行比较,在进行比较之前进行一些四舍五入,或者使用准确的类型,如
BigDecimal
Rational

您会使用什么而不是浮点数进行比较?在化学中,我可能需要的最特殊的是.00001;在数学运算中使用浮点数有什么好处吗?使用浮点数代替其他类型没有明显的好处,而且为了精确起见,您还必须考虑有效数字并处理舍入问题。然而,将所有值乘以10k并使用整数数学也是有问题的,所以我现在还是坚持使用浮点数。如果您需要的最大精度是.00001,那么处理比较的最佳方法是通过我上面描述的方法,使用(x-y).abs<0.000001左右作为等式的最大增量。错误通常超出1e-9范围,因此这是正常的。