Armando Padilla <mando81 / prodigy.net> wrote: > > I actually like Maddox truncate example. Thanks Maddox. i wasnt aware > of both that feature and *.format <digit here> Klemme suggested. I'm using that : def aprox( eps = 1.0e-10 ) ( self / eps ).round * eps end with : a_float = 1.2345678901234567890 epss = [ 1.0e-10, 1.0e-8, 1.0e-6, 1.0e-4, 1.0e-2, 1.0, 1.0e2] epss.each do | eps | puts "#{a_float}.aprox( #{eps} ) -o-> #{a_float.aprox( eps )}" end gives : 1.23456789012346.aprox( 1.0e-10 ) -o-> 1.2345678901 1.23456789012346.aprox( 1.0e-08 ) -o-> 1.23456789 1.23456789012346.aprox( 1.0e-06 ) -o-> 1.234568 1.23456789012346.aprox( 0.0001 ) -o-> 1.2346 1.23456789012346.aprox( 0.01 ) -o-> 1.23 1.23456789012346.aprox( 1.0 ) -o-> 1.0 1.23456789012346.aprox( 100.0 ) -o-> 0.0 I'm also using an aproximate float comparator : def ===( aFloat, eps = 1.0e-10) begin clazz = aFloat.class.to_s raise "Argument \"#{aFloat}\" must be a Float (being of #{clazz})." if clazz != "Float" ( self > aFloat - eps ) && ( self < aFloat + eps ) rescue puts "An error occurred: #{$!}" nil end end with : vref = 2.0 val = [ 2.00000000002, 2.00000002, 2.00002, 2.002 ] val.each do | v | puts "( #{vref} ===? #{v} ) = #{( vref === v )}" puts "( #{vref} ===? #{v}, 1.0e-8 ) = #{( vref.===(v, 1.0e-8) )}" puts "( #{vref} ===? #{v}, 1.0e-6 ) = #{( vref.===(v, 1.0e-6) )}" puts "( #{vref} ===? #{v}, 1.0e-4 ) = #{( vref.===(v, 1.0e-4) )}" end gives : ( 2.0 ===? 2.00000000002 ) = true ( 2.0 ===? 2.00000000002, 1.0e-8 ) = true ( 2.0 ===? 2.00000000002, 1.0e-6 ) = true ( 2.0 ===? 2.00000000002, 1.0e-4 ) = true ( 2.0 ===? 2.00000002 ) = false ( 2.0 ===? 2.00000002, 1.0e-8 ) = false ( 2.0 ===? 2.00000002, 1.0e-6 ) = true ( 2.0 ===? 2.00000002, 1.0e-4 ) = true ( 2.0 ===? 2.00002 ) = false ( 2.0 ===? 2.00002, 1.0e-8 ) = false ( 2.0 ===? 2.00002, 1.0e-6 ) = false ( 2.0 ===? 2.00002, 1.0e-4 ) = true ( 2.0 ===? 2.002 ) = false ( 2.0 ===? 2.002, 1.0e-8 ) = false ( 2.0 ===? 2.002, 1.0e-6 ) = false ( 2.0 ===? 2.002, 1.0e-4 ) = false -- Une B?vue