[PATCH] Sunbug 6358355: Rounding error in Float.parseFloat

Louis Wasserman wasserman.louis at gmail.com
Thu Jul 12 13:15:16 UTC 2012

Float.parseFloat doesn't currently round correctly, or even monotonically,
in certain cases.

In particular, the following test program prints false:

public class Foo {
  public static void main(String[] args) {
    System.out.println(144115196665790480f <= 144115196665790481f);

A patch is attached, and can also be found at

There was a comment in sun.misc.FloatingDecimal claiming this would take
400 lines of code, but by eliminating the (fallacious) "sticky rounding"
logic, and just duplicating the double-parsing logic, it only ends up
costing ~40 net lines of code added.

The added code is mostly identical to the preexisting double-parsing code.

This is a prerequisite for the separate, previously sent patch improving
the performance of BigInteger.doubleValue() and floatValue().  (Testing for
that patch revealed this bug.)

Louis Wasserman
wasserman.louis at gmail.com

More information about the core-libs-dev mailing list