From: David Garamond Date: 2004-06-28T03:31:49+09:00 Subject: Re: rounding to n decimal digits Michael C. Libby wrote: >>> class Float >>> def round_n(n=0) >>> raise FloatDomainError unless self.finite? >>> raise ArgumentError unless n.class == Fixnum && n >= 0 >>> sprintf("%.#{n}f", self).to_f >>> end >>> >>> def ceil_n(n=0) >>> raise FloatDomainError unless self.finite? >>> raise ArgumentError unless n.class == Fixnum && n >= 0 >>> (self*10**n).ceil.to_f / 10**n >>> end >>> >>> def floor_n(n=0) >>> raise FloatDomainError unless self.finite? >>> raise ArgumentError unless n.class == Fixnum && n >= 0 >>> (self*10**n).floor.to_f / 10**n >>> end >>> end >>> > > That's the same technique he's using for ceil and floor-- seems like the > best approach available (the only thing left to do now is test whether > multiply and divide is faster than sprintf). Except that instead of > defining round_n, ceil_n, and floor_n, I would probably just redefine > the existing Float#round, Float#ceil and Float#floor methods. Because > he's got n=0 in the method signature existing code that depends on the > default behavior of Float should be fine. Btw, if you want to override #round, #ceil, #floor, remember to return a Fixnum if n=0 to avoid breaking other code. -- dave