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