From 4437b63ee5d5bec4eab99cff51ca2a4b593cc3eb Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 19 Nov 2024 16:42:29 +0800 Subject: [PATCH] =?UTF-8?q?Excel07SaxReader=E4=B8=AD=EF=BC=8C=E5=AF=B9?= =?UTF-8?q?=E4=BA=8E=E5=B0=8F=E6=95=B0=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=B2=BE=E5=BA=A6=E5=88=A4=E6=96=AD=EF=BC=88issue#IB0?= =?UTF-8?q?EJ9@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../java/cn/hutool/json/Issue3790Test.java | 25 +++++++++++++++++++ .../cn/hutool/poi/excel/sax/ExcelSaxUtil.java | 11 +++++++- .../cn/hutool/poi/excel/IssueIB0EJ9Test.java | 2 +- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Issue3790Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 68da07f4f..6d5117b59 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,13 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.34(2024-11-15) +# 5.8.34(2024-11-19) ### 🐣新特性 * 【http 】 增加Windows微信浏览器识别(issue#IB3SJF@Gitee) * 【core 】 ZipUtil.unzip增加编码容错(issue#I3UZ28@Gitee) * 【core 】 Calculator兼容`x`字符作为乘号(issue#3787@Github) +* 【poi 】 Excel07SaxReader中,对于小数类型,增加精度判断(issue#IB0EJ9@Gitee) ### 🐞Bug修复 * 【core 】 修复DateUtil.rangeToList中step小于等于0时无限循环问题(issue#3783@Github) diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue3790Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue3790Test.java new file mode 100644 index 000000000..46132355c --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Issue3790Test.java @@ -0,0 +1,25 @@ +package cn.hutool.json; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class Issue3790Test { + @Test + void bigDecimalToStringTest() { + BigDecimal bigDecimal = new BigDecimal("0.01"); + bigDecimal = bigDecimal.setScale(4, RoundingMode.HALF_UP); + + Dto dto = new Dto(); + dto.remain = bigDecimal; + + final String jsonStr = JSONUtil.toJsonStr(dto, JSONConfig.create().setStripTrailingZeros(false)); + Assertions.assertEquals("{\"remain\":0.0100}", jsonStr); + } + + static class Dto { + public BigDecimal remain; + } +} diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxUtil.java index ff12045ef..e27fd5bf6 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxUtil.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.DependencyException; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelDateUtil; import cn.hutool.poi.excel.sax.handler.RowHandler; @@ -264,7 +265,15 @@ public class ExcelSaxUtil { if (StrUtil.isBlank(value)) { return null; } - return getNumberValue(Double.parseDouble(value), numFmtString); + + // issue#IB0EJ9 可能精度丢失 + final double number = Double.parseDouble(value); + if(false == value.equals(Double.toString(number))){ + // 精度丢失 + return NumberUtil.toBigDecimal(value); + } + + return getNumberValue(number, numFmtString); } /** diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueIB0EJ9Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueIB0EJ9Test.java index dbc32f4e2..c5f82332e 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueIB0EJ9Test.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/IssueIB0EJ9Test.java @@ -9,7 +9,7 @@ public class IssueIB0EJ9Test { @Test @Disabled void saxReadTest() { - ExcelUtil.readBySax(FileUtil.file("d:/test/bbb.xlsx"), "Sheet1", + ExcelUtil.readBySax(FileUtil.file("d:/test/数值型测试.xlsx"), "hcm工资表", (sheetIndex, rowIndex, rowlist) -> Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist)); } }