Fix a problem with BigDecimal, where the bitlength of a zero value was not being computed properly. Patch by: jat Review by: conroy, janz git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9407 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java index 7c99ce5..0cd351f 100644 --- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java +++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -309,6 +309,10 @@ private static int bitLength(double value) { // if |value| is less than 2^47, use log if (value > -POW47 && value < POW47) { + if (value == 0.0) { + // special-case zero, otherwise we get -INFINITY below + return 0; + } boolean negative = (value < 0.0); if (negative) { value = -value;
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java index 044e19f..88e0caa 100644 --- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java +++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
@@ -724,6 +724,24 @@ } /** + * Test that constructing BigDecimals from zeros works properly. + */ + public void testConstrZero() { + BigDecimal bd = new BigDecimal("0"); + assertEquals(0, bd.intValueExact()); + assertEquals(1, bd.precision()); + assertEquals(0, bd.scale()); + bd = new BigDecimal("0.0"); + assertEquals(0, bd.intValueExact()); + assertEquals(1, bd.precision()); + assertEquals(1, bd.scale()); + bd = new BigDecimal("0.00"); + assertEquals(0, bd.intValueExact()); + assertEquals(1, bd.precision()); + assertEquals(2, bd.scale()); + } + + /** * check ONE. */ public void testFieldONE() {