This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new 0745c26da [LANG-1444] NumberUtils.createNumber() does not create
BigDecimal for decimal fractions tending to zero
0745c26da is described below
commit 0745c26dac9ac76086f10c302d252a71bf4a68c5
Author: Gary Gregory <[email protected]>
AuthorDate: Mon Apr 27 07:19:20 2026 -0400
[LANG-1444] NumberUtils.createNumber() does not create BigDecimal for
decimal fractions tending to zero
---
.../apache/commons/lang3/math/NumberUtilsTest.java | 29 +++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
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 d14e18f7b..7d901a875 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -1723,7 +1723,7 @@ void testStringCreateNumberEnsureNoPrecisionLoss() {
assertInstanceOf(BigDecimal.class,
NumberUtils.createNumber("0001.797693134862315759e+308"));
assertInstanceOf(BigDecimal.class,
NumberUtils.createNumber("-001.797693134862315759e+308"));
assertInstanceOf(BigDecimal.class,
NumberUtils.createNumber("+001.797693134862315759e+308"));
- //LANG-1613
+ // LANG-1613
assertInstanceOf(Double.class,
NumberUtils.createNumber("2.2250738585072014E-308"));
assertInstanceOf(Double.class,
NumberUtils.createNumber("2.2250738585072014E-308D"));
assertInstanceOf(Double.class,
NumberUtils.createNumber("2.2250738585072014E-308F"));
@@ -1735,6 +1735,33 @@ void testStringCreateNumberEnsureNoPrecisionLoss() {
assertInstanceOf(Double.class,
NumberUtils.createNumber("1.7976931348623157E308F"));
assertInstanceOf(Double.class, NumberUtils.createNumber("4.9e-324D"));
assertInstanceOf(Double.class, NumberUtils.createNumber("4.9e-324F"));
+ // LANG-1444
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.1"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.01"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.001"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.0001"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.00001"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.000001"));
+ assertInstanceOf(Float.class, NumberUtils.createNumber("1.0000001"));
+ assertInstanceOf(Double.class, NumberUtils.createNumber("1.00000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.0000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.00000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.000000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.0000000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.00000000000001"));
+ assertInstanceOf(Double.class,
NumberUtils.createNumber("1.000000000000001"));
+ // Now we get Floats: This happens because
Double.valueOf("1.000000000000001") = 1.000000000000001 and
Double.valueOf("1.0000000000000001") = 1.0. In
+ // the latter case because we've lost the precision, it no longer
matters whether we store the number as a Double or a Float, so we use a Float
because
+ // it's been truncated.
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.0000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.00000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.000000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.0000000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.00000000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.000000000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.0000000000000000000001"));
+ assertInstanceOf(Float.class,
NumberUtils.createNumber("1.00000000000000000000001"));
}
/**