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]);

Reply via email to