Порядок операций вопрос в рубине - PullRequest
2 голосов
/ 28 июля 2010

Я инициализирую экземпляр класса, который проверяет равенство двух формул.

Расчетные значения формулы фактически равны:

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 получить значения fw для формул1 и формулы2 и проверить равенство этих значений?Каков порядок операций в Ruby и что делает Ruby?Я вижу, что мне не хватает понимания этой проблемы.Как я могу сделать эту работу?Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

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.

3 голосов
/ 28 июля 2010

Возможно, вы не хотите проверять числа с плавающей запятой на равенство.Вместо этого вы должны сравнить дельты.

Попробуйте это в irb:

x = 1.000001
y = 1.0
x == y
(x-y).abs < 0.00001

Итак, вы найдете дельту типа 0,00001, которая, по вашему мнению, будет обрабатывать любое изменение арифметики с плавающей запятой, и использовать еесюда.Вы никогда не должны == плавать.

2 голосов
/ 28 июля 2010

Вероятно, это еще одна проблема, вызванная точностью с плавающей запятой .

Я могу заверить вас, что эти значения, рассчитанные до равенства, оцениваются.

См. Приоритет оператора в Ruby

...