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