Skip to content

Commit 0745c26

Browse files
committed
[LANG-1444] NumberUtils.createNumber() does not create BigDecimal for
decimal fractions tending to zero
1 parent 26b9fd5 commit 0745c26

1 file changed

Lines changed: 28 additions & 1 deletion

File tree

src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1723,7 +1723,7 @@ void testStringCreateNumberEnsureNoPrecisionLoss() {
17231723
assertInstanceOf(BigDecimal.class, NumberUtils.createNumber("0001.797693134862315759e+308"));
17241724
assertInstanceOf(BigDecimal.class, NumberUtils.createNumber("-001.797693134862315759e+308"));
17251725
assertInstanceOf(BigDecimal.class, NumberUtils.createNumber("+001.797693134862315759e+308"));
1726-
//LANG-1613
1726+
// LANG-1613
17271727
assertInstanceOf(Double.class, NumberUtils.createNumber("2.2250738585072014E-308"));
17281728
assertInstanceOf(Double.class, NumberUtils.createNumber("2.2250738585072014E-308D"));
17291729
assertInstanceOf(Double.class, NumberUtils.createNumber("2.2250738585072014E-308F"));
@@ -1735,6 +1735,33 @@ void testStringCreateNumberEnsureNoPrecisionLoss() {
17351735
assertInstanceOf(Double.class, NumberUtils.createNumber("1.7976931348623157E308F"));
17361736
assertInstanceOf(Double.class, NumberUtils.createNumber("4.9e-324D"));
17371737
assertInstanceOf(Double.class, NumberUtils.createNumber("4.9e-324F"));
1738+
// LANG-1444
1739+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.1"));
1740+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.01"));
1741+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.001"));
1742+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.0001"));
1743+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.00001"));
1744+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.000001"));
1745+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.0000001"));
1746+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.00000001"));
1747+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.000000001"));
1748+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.0000000001"));
1749+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.00000000001"));
1750+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.000000000001"));
1751+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.0000000000001"));
1752+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.00000000000001"));
1753+
assertInstanceOf(Double.class, NumberUtils.createNumber("1.000000000000001"));
1754+
// Now we get Floats: This happens because Double.valueOf("1.000000000000001") = 1.000000000000001 and Double.valueOf("1.0000000000000001") = 1.0. In
1755+
// 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
1756+
// it's been truncated.
1757+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.0000000000000001"));
1758+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.00000000000000001"));
1759+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.000000000000000001"));
1760+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.0000000000000000001"));
1761+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.00000000000000000001"));
1762+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.000000000000000000001"));
1763+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.0000000000000000000001"));
1764+
assertInstanceOf(Float.class, NumberUtils.createNumber("1.00000000000000000000001"));
17381765
}
17391766

17401767
/**

0 commit comments

Comments
 (0)