This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch release-1.3 in repository https://gitbox.apache.org/repos/asf/paimon.git
commit 16f0ceadfc66a1b4884deca7added23e073b9702 Author: chuangchuang <[email protected]> AuthorDate: Mon Sep 22 18:07:38 2025 +0800 [cdc] Fix cannot be cast to float due to precision loss (#6291) --- paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java | 7 +------ .../src/test/java/org/apache/paimon/utils/TypeUtilsTest.java | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java index 7b6d030104..e80b6621e9 100644 --- a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java +++ b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java @@ -144,12 +144,7 @@ public class TypeUtils { } else { // Compatible canal-cdc Float f = Float.valueOf(s); - String floatStr = f.toString(); - if (s.contains(".") && !s.contains("E")) { - int decimal = s.length() - s.indexOf(".") - 1; - floatStr = String.format("%." + decimal + "f", f); - } - if (!floatStr.equals(s)) { + if (!f.toString().equals(Double.toString(d))) { throw new NumberFormatException( s + " cannot be cast to float due to precision loss"); } else { diff --git a/paimon-common/src/test/java/org/apache/paimon/utils/TypeUtilsTest.java b/paimon-common/src/test/java/org/apache/paimon/utils/TypeUtilsTest.java index 4c204e5519..d7dab1614a 100644 --- a/paimon-common/src/test/java/org/apache/paimon/utils/TypeUtilsTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/utils/TypeUtilsTest.java @@ -198,8 +198,8 @@ public class TypeUtilsTest { @Test public void testFloatCastFromString() { - String[] values = {"123.456", "0.00042", "1.00001"}; - Float[] expected = {123.456f, 0.00042f, 1.00001f}; + String[] values = {"123.456", "0.00042", "1.00001", "175.26562", "0.00046", "6.1042607E-4"}; + Float[] expected = {123.456f, 0.00042f, 1.00001f, 175.26562f, 0.00046f, 0.00061042607f}; for (int i = 0; i < values.length; i++) { Object result = TypeUtils.castFromCdcValueString(values[i], DataTypes.FLOAT()); assertThat(result).isEqualTo(expected[i]);
