diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONReader.java b/core/src/main/java/com/alibaba/fastjson2/JSONReader.java index 36c453033e..e265baf5b9 100644 --- a/core/src/main/java/com/alibaba/fastjson2/JSONReader.java +++ b/core/src/main/java/com/alibaba/fastjson2/JSONReader.java @@ -2873,51 +2873,6 @@ public final Number getNumber() { if (mag0 == 0 && mag1 == 0) { if (mag2 == 0 && mag3 >= 0) { int unscaledVal = negative ? -mag3 : mag3; - - if (exponent == 0) { - if ((context.features & Feature.UseBigDecimalForFloats.mask) != 0) { - switch (scale) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - return (float) (unscaledVal / DOUBLE_10_POW[scale]); - default: - break; - } - } else if ((context.features & Feature.UseBigDecimalForDoubles.mask) != 0) { - if (unscaledVal == 0) { - return DOUBLE_ZERO; - } - - switch (scale) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - return unscaledVal / DOUBLE_10_POW[scale]; - default: - break; - } - } - } decimal = BigDecimal.valueOf(unscaledVal, scale); } else { long v3 = mag3 & 0XFFFFFFFFL; @@ -3008,26 +2963,17 @@ public final Number getNumber() { int adjustedScale = scale - exponent; decimal = new BigDecimal(bigInt, adjustedScale); - - if (exponent != 0) { + if (exponent != 0 && (context.features & (Feature.UseBigDecimalForDoubles.mask | Feature.UseBigDecimalForFloats.mask)) == 0) { return decimal.doubleValue(); } } - if (exponent != 0) { + if (exponent != 0 && (context.features & (Feature.UseBigDecimalForDoubles.mask | Feature.UseBigDecimalForFloats.mask)) == 0) { String decimalStr = decimal.toPlainString(); return Double.parseDouble( decimalStr + "E" + exponent); } - if ((context.features & Feature.UseBigDecimalForFloats.mask) != 0) { - return decimal.floatValue(); - } - - if ((context.features & Feature.UseBigDecimalForDoubles.mask) != 0) { - return decimal.doubleValue(); - } - return decimal; } case JSON_TYPE_BIG_DEC: { diff --git a/core/src/test/java/com/alibaba/fastjson2/JSONReaderFloatTest.java b/core/src/test/java/com/alibaba/fastjson2/JSONReaderFloatTest.java index 1c4c553290..d97010d270 100644 --- a/core/src/test/java/com/alibaba/fastjson2/JSONReaderFloatTest.java +++ b/core/src/test/java/com/alibaba/fastjson2/JSONReaderFloatTest.java @@ -3,6 +3,8 @@ import com.alibaba.fastjson2.util.IOUtils; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; + import static org.junit.jupiter.api.Assertions.assertEquals; public class JSONReaderFloatTest { @@ -18,8 +20,8 @@ public void test5() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -30,8 +32,8 @@ public void test5() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -42,8 +44,8 @@ public void test5() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -54,8 +56,8 @@ public void test5() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -66,8 +68,8 @@ public void test5() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -94,8 +96,8 @@ public void test10() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -106,8 +108,8 @@ public void test10() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -118,8 +120,8 @@ public void test10() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -130,8 +132,8 @@ public void test10() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -142,8 +144,8 @@ public void test10() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -170,8 +172,8 @@ public void test15() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -182,8 +184,8 @@ public void test15() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -194,8 +196,8 @@ public void test15() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -206,8 +208,8 @@ public void test15() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -218,8 +220,8 @@ public void test15() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -246,8 +248,8 @@ public void test20() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -258,8 +260,8 @@ public void test20() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -270,8 +272,8 @@ public void test20() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -282,8 +284,8 @@ public void test20() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -294,8 +296,8 @@ public void test20() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -322,8 +324,8 @@ public void test25() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -334,8 +336,8 @@ public void test25() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -346,8 +348,8 @@ public void test25() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -358,8 +360,8 @@ public void test25() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -370,8 +372,8 @@ public void test25() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -408,8 +410,8 @@ public void test30() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -420,8 +422,8 @@ public void test30() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -432,8 +434,8 @@ public void test30() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -444,8 +446,8 @@ public void test30() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -456,8 +458,8 @@ public void test30() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } @@ -484,8 +486,8 @@ public void test35() { double d0 = Double.parseDouble(str0); assertEquals(f0, JSON.parseObject(str0, Float.class)); assertEquals(d0, JSON.parseObject(str0, Double.class)); - assertEquals(f0, ((Float) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d0, ((Double) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d0, ((BigDecimal) JSON.parse(str0, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i1 = 0; i1 < 10; i1++) { char c1 = (char) ('0' + i1); @@ -496,8 +498,8 @@ public void test35() { double d1 = Double.parseDouble(str1); assertEquals(f1, JSON.parseObject(str1, Float.class)); assertEquals(d1, JSON.parseObject(str1, Double.class)); - assertEquals(f1, ((Float) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d1, ((Double) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d1, ((BigDecimal) JSON.parse(str1, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i2 = 0; i2 < 10; i2++) { char c2 = (char) ('0' + i2); @@ -508,8 +510,8 @@ public void test35() { double d2 = Double.parseDouble(str2); assertEquals(f2, JSON.parseObject(str2, Float.class)); assertEquals(d2, JSON.parseObject(str2, Double.class)); - assertEquals(f2, ((Float) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d2, ((Double) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d2, ((BigDecimal) JSON.parse(str2, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i3 = 0; i3 < 10; i3++) { char c3 = (char) ('0' + i3); @@ -520,8 +522,8 @@ public void test35() { double d3 = Double.parseDouble(str3); assertEquals(f3, JSON.parseObject(str3, Float.class)); assertEquals(d3, JSON.parseObject(str3, Double.class)); - assertEquals(f3, ((Float) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d3, ((Double) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d3, ((BigDecimal) JSON.parse(str3, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); for (int i4 = 0; i4 < 10; i4++) { char c4 = (char) ('0' + i4); @@ -532,8 +534,8 @@ public void test35() { double d4 = Double.parseDouble(str4); assertEquals(f4, JSON.parseObject(str4, Float.class)); assertEquals(d4, JSON.parseObject(str4, Double.class)); - assertEquals(f4, ((Float) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); - assertEquals(d4, ((Double) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); + assertEquals(f4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForFloats)).floatValue()); + assertEquals(d4, ((BigDecimal) JSON.parse(str4, JSONReader.Feature.UseBigDecimalForDoubles)).doubleValue()); } } } diff --git a/core/src/test/java/com/alibaba/fastjson2/features/UseBigDecimalForFloats.java b/core/src/test/java/com/alibaba/fastjson2/features/UseBigDecimalForFloats.java index 8fc3b21592..779f88f878 100644 --- a/core/src/test/java/com/alibaba/fastjson2/features/UseBigDecimalForFloats.java +++ b/core/src/test/java/com/alibaba/fastjson2/features/UseBigDecimalForFloats.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSONReader; import org.junit.jupiter.api.Test; +import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,7 +18,7 @@ public void decimal_as_float() { JSONObject object = JSON.parseObject(str, JSONReader.Feature.UseBigDecimalForFloats); Object val = object.get("val"); assertNotNull(val); - assertEquals(Float.class, val.getClass()); + assertEquals(BigDecimal.class, val.getClass()); } @Test @@ -26,7 +27,7 @@ public void decimal_as_float_utf8() { JSONObject object = JSON.parseObject(str.getBytes(StandardCharsets.UTF_8), JSONReader.Feature.UseBigDecimalForFloats); Object val = object.get("val"); assertNotNull(val); - assertEquals(Float.class, val.getClass()); + assertEquals(BigDecimal.class, val.getClass()); } @Test @@ -35,7 +36,7 @@ public void decimal_as_double() { JSONObject object = JSON.parseObject(str, JSONReader.Feature.UseBigDecimalForDoubles); Object val = object.get("val"); assertNotNull(val); - assertEquals(Double.class, val.getClass()); + assertEquals(BigDecimal.class, val.getClass()); } @Test @@ -44,6 +45,6 @@ public void decimal_as_double_utf8() { JSONObject object = JSON.parseObject(str.getBytes(StandardCharsets.UTF_8), JSONReader.Feature.UseBigDecimalForDoubles); Object val = object.get("val"); assertNotNull(val); - assertEquals(Double.class, val.getClass()); + assertEquals(BigDecimal.class, val.getClass()); } } diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_2800/Issue2866.java b/core/src/test/java/com/alibaba/fastjson2/issues_2800/Issue2866.java new file mode 100644 index 0000000000..892766c738 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues_2800/Issue2866.java @@ -0,0 +1,20 @@ +package com.alibaba.fastjson2.issues_2800; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue2866 { + @Test + public void test() throws Exception { + String str = "0E-18"; + BigDecimal expected = new BigDecimal(str).stripTrailingZeros(); + + BigDecimal decimal = (BigDecimal) JSON.parse(str, JSONReader.Feature.UseBigDecimalForDoubles); + assertEquals(expected, decimal); + } +}