diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java b/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java
index 07f7324cfe..af1cff0bda 100644
--- a/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java
+++ b/hutool-core/src/main/java/cn/hutool/v7/core/math/NumberParser.java
@@ -21,6 +21,7 @@ import cn.hutool.v7.core.convert.ConvertUtil;
import cn.hutool.v7.core.text.CharUtil;
import cn.hutool.v7.core.text.StrUtil;
+import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
@@ -40,7 +41,7 @@ import java.util.Locale;
*
*
* 构造时可选是否将NaN转为0,默认为true。
- * 参考:https://stackoverflow.com/questions/5876369/why-does-casting-double-nan-to-int-not-throw-an-exception-in-java
+ * 参考:why-does-casting-double-nan-to-int-not-throw-an-exception-in-java
*
*
* @author Looly
@@ -374,6 +375,16 @@ public class NumberParser {
// issue@4197@Github 转为半角
numberStr = ConvertUtil.toDBC(numberStr);
+ // issue#IDJ1NS@Gitee 处理科学计数法E+格式
+ // NumberFormat对E+格式支持不佳,使用BigDecimal直接解析
+ if (StrUtil.containsIgnoreCase(numberStr, "e")) {
+ try {
+ return new BigDecimal(numberStr);
+ } catch (final NumberFormatException e) {
+ // BigDecimal解析失败,继续使用NumberFormat尝试
+ }
+ }
+
try {
final NumberFormat format = NumberFormat.getInstance(locale);
if (format instanceof DecimalFormat) {
diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java
index de813d60c8..dea7c5eb8a 100644
--- a/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/v7/core/math/NumberUtilTest.java
@@ -528,6 +528,16 @@ public class NumberUtilTest {
}
+ @Test
+ void issueIDJ1NSTest(){
+ final String numberstr1 = "8.37095942E+9";
+ final BigDecimal result1 = (BigDecimal) NumberUtil.parseNumber(numberstr1);
+ final String numberstr2 = "8.37095942e+9";
+ final BigDecimal result2 = (BigDecimal) NumberUtil.parseNumber(numberstr2);
+ assertEquals(new BigDecimal("8370959420").toPlainString(), result1.toPlainString());
+ assertEquals(new BigDecimal("8370959420").toPlainString(), result2.toPlainString());
+ }
+
@Test
public void parseHexNumberTest() {
// 千位分隔符去掉