This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 5103f3a5e1 [cdc] Fix float precision handling in TypeUtils (#5269)
5103f3a5e1 is described below

commit 5103f3a5e1caddd456210864e885c9988ca34bad
Author: Alex <[email protected]>
AuthorDate: Mon Mar 31 15:28:09 2025 +0800

    [cdc] Fix float precision handling in TypeUtils (#5269)
---
 .../src/main/java/org/apache/paimon/utils/TypeUtils.java       |  7 ++++++-
 .../src/test/java/org/apache/paimon/utils/TypeUtilsTest.java   | 10 ++++++----
 2 files changed, 12 insertions(+), 5 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 4f96909ceb..7b6d030104 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,7 +144,12 @@ public class TypeUtils {
                 } else {
                     // Compatible canal-cdc
                     Float f = Float.valueOf(s);
-                    if (f.toString().length() != s.length()) {
+                    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)) {
                         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 81422cf3d8..4c204e5519 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,10 +198,12 @@ public class TypeUtilsTest {
 
     @Test
     public void testFloatCastFromString() {
-        String value = "123.456";
-        Object result = TypeUtils.castFromCdcValueString(value, 
DataTypes.FLOAT());
-        Float expected = 123.456f;
-        assertThat(result).isEqualTo(expected);
+        String[] values = {"123.456", "0.00042", "1.00001"};
+        Float[] expected = {123.456f, 0.00042f, 1.00001f};
+        for (int i = 0; i < values.length; i++) {
+            Object result = TypeUtils.castFromCdcValueString(values[i], 
DataTypes.FLOAT());
+            assertThat(result).isEqualTo(expected[i]);
+        }
     }
 
     @Test

Reply via email to