Rob Biedenharn wrote: > On Feb 7, 2008, at 5:26 PM, Henry Jones wrote: > >> BigDecimal.new('15.25').to_f == 15.25.to_f also returns false. >> >> Substracting both values returns 1.7763... e-015 >> >> This is on ruby 1.8.6, Win32. >> >> I'm a comp. engineer, so I know it's ultimately related to the binary >> value of 15.25 which cannot be precisely represented (without an >> infinite number of bits) , but I'm still amazed that such a simple >> comparison with a literal value should fail... > > > 15.25 in decimal > is exactly > 1111.01 in binary > > Seems like a finite number of bits to me ;-) However, the > construction of 15.25 as a literal is likely something roughly (1*10^1 > + 5*10^0) + (2*10^-1 + 5*10^-2) and those intermediate fractional > terms are problematic. > > Hey, this is Ruby! Roll your own with === > > irb> class Float > irb> def ===(other,eps=0.000000001) > irb> (self - other.to_f).abs < eps > irb> end > irb> end > => nil > irb> require 'bigdecimal' > => true > irb> 15.25 == BigDecimal.new("15.25") > => false > irb> 15.25 === BigDecimal.new("15.25") > => true > > Of course, you'd have to add a similar BigDecimal#=== to get symmetry. > > -Rob > > Rob Biedenharn http://agileconsultingllc.com > Rob / AgileConsultingLLC.com Apparently the problem lies with BigDecimal, and not the literal value : "%.30f" % 15.25 will print : "15.250000000000000000000000000000" (not copy pasted, don't count the zeros =) ) but "%.30f" % BigDecimal("15.25") will print : "15.250000000000002000000000000000" (notice the '2' in there) -- Posted via http://www.ruby-forum.com/.