Floating point accuracy in JRuby

[ 03:23 PM (5) omega:thoth ~ ] > jirb
irb(main):001:0> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
=> 0.9999999999999999
[ 03:33 PM (8) omega:thoth ~ ] > irb

0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
=> 1.0

Disappointing that JRuby does not handle floating point numbers (a) in
the the same way as CRuby and (b) not as accurately. Is the cost of
implementing CRuby’s behavior prohibitively high on the JVM, is there
a fix planned in the future? How would JRuby users recommend handling
currency on that platform?

steven

Steven D. Arnold wrote:

fix planned in the future? How would JRuby users recommend handling
currency on that platform?

steven

irb(main):001:0> printf “%20.18f”,
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
0.999999999999999889=> nil

irb(main):004:0* RUBY_VERSION
=> “1.8.6”

When handling currency I’d suggest storing everything in cents with
integers
and using a Money library like http://money.rubyforge.org/. You won’t
have
any rounding errors then.

On Thu, Jun 18, 2009 at 3:44 PM, Steven D. Arnold <

Steven D. Arnold wrote:

fix planned in the future? How would JRuby users recommend handling
currency on that platform?

steven

I don’t think it’s a good idea to use binary floating-point numbers for
currency in any language or any platform. See the numerous previous
discussions of binary vs. decimal arithmetic on this list.

Use integer cents instead, or BigDecimal.