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范围,因此这是正常的。