Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assert_equal says <0.15> expected but was <0.15>, but only if the method computes 0.15 in a certain way

So for this model method:

def tax_rate
  tax_rate = 0.0
  tax_rate += STATE_TAX if state_taxable?  #STATE_TAX = 0.1
  tax_rate += IMPORT_TAX if imported?      #IMPORT_TAX = 0.05
  tax_rate
end

This test fails:

@item.update_attributes({:state_taxable => true,
                         :imported => true,
                         :price => 32.19})
assert_equal 0.15, @item.tax_rate

I get this error:

<0.15> expected but was <0.15>.

However, this test will pass:

@item.update_attributes({:state_taxable => true,
                         :imported => false,
                         :price => 14.99})
assert_equal 0.1, @item.tax_rate

So I get the error when tax_rate does 0.0 + 0.1 + 0.05, but not when it does 0.0 + 0.1, or 0.0 + 0.05. Both 0.15s are Floats, so I don't see what could be causing this. I've spent too long mulling over this, hopefully someone can point out what the culprit is. Thanks in advance guys.

like image 770
solidcell Avatar asked Dec 17 '22 22:12

solidcell


1 Answers

Floating-point numbers can't be represented exactly; what you need to do is use assert_in_delta to check you're within a specified range.

Something like assert_in_delta 0.15, @item.tax_rate, 0.001 should do it: it'll check you're within 0.001 of the expected value.

like image 110
John Y Avatar answered Jan 13 '23 11:01

John Y