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"));
     }
 
     /**

Reply via email to