You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pa...@apache.org on 2016/06/12 11:27:43 UTC

[1/2] [lang] LANG-1018: Fix precision loss on NumberUtils.createNumber(String) (closes #156)

Repository: commons-lang
Updated Branches:
  refs/heads/master 7fd021d82 -> d2fb3b086


LANG-1018: Fix precision loss on NumberUtils.createNumber(String) (closes #156)


Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/8d6bc0ca
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/8d6bc0ca
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/8d6bc0ca

Branch: refs/heads/master
Commit: 8d6bc0ca625f3a1a98b486541fa613b2fac4b41c
Parents: 7fd021d
Author: Nick Manley <ni...@outlook.com>
Authored: Thu Jun 9 23:04:18 2016 -0500
Committer: pascalschumacher <pa...@gmx.net>
Committed: Sun Jun 12 13:23:55 2016 +0200

----------------------------------------------------------------------
 .../apache/commons/lang3/math/NumberUtils.java  | 26 ++++++++------------
 .../commons/lang3/math/NumberUtilsTest.java     |  4 +++
 2 files changed, 14 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8d6bc0ca/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/math/NumberUtils.java b/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
index 22dddf4..3d59057 100644
--- a/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
+++ b/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
@@ -491,9 +491,7 @@ public class NumberUtils {
         // if both e and E are present, this is caught by the checks on expPos (which prevent IOOBE)
         // and the parsing which will detect if e or E appear in a number due to using the wrong offset
 
-        int numDecimals = 0; // Check required precision (LANG-693)
         if (decPos > -1) { // there is a decimal point
-
             if (expPos > -1) { // there is an exponent
                 if (expPos < decPos || expPos > str.length()) { // prevents double exponent causing IOOBE
                     throw new NumberFormatException(str + " is not a valid number.");
@@ -503,7 +501,6 @@ public class NumberUtils {
                 dec = str.substring(decPos + 1);
             }
             mant = getMantissa(str, decPos);
-            numDecimals = dec.length(); // gets number of digits past the decimal to ensure no loss of precision for floating point numbers.
         } else {
             if (expPos > -1) {
                 if (expPos > str.length()) { // prevents double exponent causing IOOBE
@@ -599,26 +596,23 @@ public class NumberUtils {
         //Must be a Float, Double, BigDecimal
         final boolean allZeros = isAllZeros(mant) && isAllZeros(exp);
         try {
-            if(numDecimals <= 7){// If number has 7 or fewer digits past the decimal point then make it a float
-                final Float f = createFloat(str);
-                if (!(f.isInfinite() || (f.floatValue() == 0.0F && !allZeros))) {
-                    return f;
-                }
+            final Float f = createFloat(str);
+            final Double d = createDouble(str);
+            if (!f.isInfinite()
+                    && !(f.floatValue() == 0.0F && !allZeros)
+                    && f.toString().equals(d.toString())) {
+                return f;
             }
-        } catch (final NumberFormatException nfe) { // NOPMD
-            // ignore the bad number
-        }
-        try {
-            if(numDecimals <= 16){// If number has between 8 and 16 digits past the decimal point then make it a double
-                final Double d = createDouble(str);
-                if (!(d.isInfinite() || (d.doubleValue() == 0.0D && !allZeros))) {
+            if (!d.isInfinite() && !(d.doubleValue() == 0.0D && !allZeros)) {
+                final BigDecimal b = createBigDecimal(str);
+                if (b.compareTo(BigDecimal.valueOf(d)) == 0) {
                     return d;
                 }
+                return b;
             }
         } catch (final NumberFormatException nfe) { // NOPMD
             // ignore the bad number
         }
-
         return createBigDecimal(str);
     }
 

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/8d6bc0ca/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
index 236084b..e2143bd 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -242,6 +242,10 @@ public class NumberUtilsTest {
         final Number bigNum = NumberUtils.createNumber("-1.1E-700F");
         assertNotNull(bigNum);
         assertEquals(BigDecimal.class, bigNum.getClass());
+        
+        // LANG-1018
+        assertEquals("createNumber(String) LANG-1018 failed",
+                Double.valueOf("-160952.54"), NumberUtils.createNumber("-160952.54"));
     }
     
     @Test


[2/2] [lang] LANG-1018: add changes.xml entry

Posted by pa...@apache.org.
LANG-1018: add changes.xml entry

add test for LANG-1187: Method createNumber from NumberUtils doesn't work for floating point numbers other than Float (fixed by LANG-1018)

add test for LANG-1215: NumberUtils.createNumber() method lost precision sometimes (fixed by LANG-1018)

side-effects: close #9, close #7, close #93


Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/d2fb3b08
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/d2fb3b08
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/d2fb3b08

Branch: refs/heads/master
Commit: d2fb3b0865a87cc909e4faab7733f993356141e2
Parents: 8d6bc0c
Author: pascalschumacher <pa...@gmx.net>
Authored: Sun Jun 12 12:49:15 2016 +0200
Committer: pascalschumacher <pa...@gmx.net>
Committed: Sun Jun 12 13:25:42 2016 +0200

----------------------------------------------------------------------
 src/changes/changes.xml                                        | 1 +
 .../java/org/apache/commons/lang3/math/NumberUtilsTest.java    | 6 ++++++
 2 files changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/d2fb3b08/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e48726d..8b4e061 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -46,6 +46,7 @@ The <action> type attribute can be add,update,fix,remove.
   <body>
 
   <release version="3.5" date="tba" description="tba">
+    <action issue="LANG-1018" type="fix" dev="pschumacher" due-to="Nick Manley">Fix precision loss on NumberUtils.createNumber(String)</action>
     <action issue="LANG-1229" type="update" dev="pschumacher" due-to="Ruslan Cheremin">HashCodeBuilder.append(Object,Object) is too big to be inlined, which prevents whole builder to be scalarized</action>
     <action issue="LANG-1085" type="add" dev="oheger" due-to="oheger / kinow">Add a circuit breaker implementation</action>
     <action issue="LANG-1013" type="add" dev="pschumacher" due-to="Thiago Andrade">Add StringUtils.truncate()</action>

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/d2fb3b08/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
index e2143bd..9b785f0 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -246,6 +246,12 @@ public class NumberUtilsTest {
         // LANG-1018
         assertEquals("createNumber(String) LANG-1018 failed",
                 Double.valueOf("-160952.54"), NumberUtils.createNumber("-160952.54"));
+        // LANG-1187
+        assertEquals("createNumber(String) LANG-1187 failed",
+                Double.valueOf("6264583.33"), NumberUtils.createNumber("6264583.33"));
+        // LANG-1215
+        assertEquals("createNumber(String) LANG-1215 failed",
+                Double.valueOf("193343.82"), NumberUtils.createNumber("193343.82"));
     }
     
     @Test