From: "marcandre (Marc-Andre Lafortune)" Date: 2013-12-05T00:44:08+09:00 Subject: [ruby-core:58855] [ruby-trunk - Bug #9192] Inconsistent comparison between Float and BigDecimal Issue #9192 has been updated by marcandre (Marc-Andre Lafortune). duerst (Martin D��rst) wrote: > ... > But simply converting BigDecimal to Float may not make sense in general. Imagine a BigDecimal with much higher precision, like > BigDecimal('706.06059999999999'), and some corresponding floats. We may want to actually say that the BigDecimal is bigger or smaller than the float created from the same string, because the float looses precision. > Currently, I get > 706.06059999999999 <=> BigDecimal('706.06059999999999') #=> 0 > BigDecimal('706.06059999999999') <=> 706.0605999999999 #=> -1 > which is of course inconsistent. We should in any case make sure that > (a <=> b) + (b <=> a) > is always 0 wherever the comparison makes sense. Agreed. The float we write as 706.0606 represents a small range of real values that includes the real number 706.06059999999999. So the first result is correct: 706.0606 <=> BigDecimal('706.06059999999999') #=> 0, ok The only strange effect is that we can get: a == x # => true b == x # => true a == b # => false when x is a Float and a or b are higher precision numerics. This can be explained because the first two comparison involve floats and thus dealing with approximate values. ---------------------------------------- Bug #9192: Inconsistent comparison between Float and BigDecimal https://bugs.ruby-lang.org/issues/9192#change-43412 Author: vatsu (Gustavo Sales) Status: Assigned Priority: Normal Assignee: mrkn (Kenta Murata) Category: ext Target version: ruby -v: 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin11.4.2] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN I was checking a possible inconsistency on ActiveModel and I found situations where comparing BigDecimal to Float differs to comparing Float to BigDecimal. I have create a simple ruby script to exemplify the problem. The script is attach to this issue and output is as follows: Instance number 706.05 ########### Instance number 706.06 Inconsistence: 0.70606E3 > 706.06 706.06 < 0.70606E3 ========= Inconsistence: 0.70606E3 <= 706.06 706.06 >= 0.70606E3 ========= ########### Instance number 706.07 Inconsistence: 0.70607E3 < 706.07 706.07 > 0.70607E3 ========= Inconsistence: 0.70607E3 >= 706.07 706.07 <= 0.70607E3 ========= ########### Instance number 706.08 ########### -- http://bugs.ruby-lang.org/