diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index 98cd668..113fc67 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -64,6 +64,7 @@
 import org.apache.asterix.common.api.Duration;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.utils.Servlets;
+import org.apache.asterix.runtime.evaluators.common.NumberUtils;
 import org.apache.asterix.test.server.ITestServer;
 import org.apache.asterix.test.server.TestServerProvider;
 import org.apache.asterix.testframework.context.TestCaseContext;
@@ -373,25 +374,30 @@
                     }
                     return false;
                 } else {
-                    // If the fields are floating-point numbers, test them
-                    // for equality safely
+                    // Get the String values
                     expectedFields[j] = expectedFields[j].split(",")[0];
                     actualFields[j] = actualFields[j].split(",")[0];
-                    try {
-                        Double double1 = Double.parseDouble(expectedFields[j]);
-                        Double double2 = Double.parseDouble(actualFields[j]);
-                        float float1 = (float) double1.doubleValue();
-                        float float2 = (float) double2.doubleValue();
 
-                        if (Math.abs(float1 - float2) == 0) {
-                            continue;
-                        } else {
+                    // Ensure type compatibility before value comparison
+                    if (NumberUtils.isSameTypeNumericStrings(expectedFields[j], actualFields[j])) {
+                        try {
+                            Double double1 = Double.parseDouble(expectedFields[j]);
+                            Double double2 = Double.parseDouble(actualFields[j]);
+                            float float1 = (float) double1.doubleValue();
+                            float float2 = (float) double2.doubleValue();
+
+                            if (Math.abs(float1 - float2) == 0) {
+                                continue;
+                            } else {
+                                return false;
+                            }
+                        } catch (NumberFormatException ignored) {
+                            // Guess they weren't numbers - must simply not be equal
                             return false;
                         }
-                    } catch (NumberFormatException ignored) {
-                        // Guess they weren't numbers - must simply not be equal
-                        return false;
                     }
+
+                    return false; // Not equal
                 }
             }
         }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/ensure_result_numeric_type/ensure_result_numeric_type.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/ensure_result_numeric_type/ensure_result_numeric_type.3.query.sqlpp
new file mode 100644
index 0000000..3933e66
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/ensure_result_numeric_type/ensure_result_numeric_type.3.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ /*
+  * This test is expected to return a ComparisonException
+  * because the actual returned value is 3 (int) but the expected
+  * value is 3.0 (double)
+  */
+
+
+select element strict_count((
+    select element x
+    from  [1,2,3] as x
+));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/ensure_result_numeric_type/ensure_result_numeric_type.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/ensure_result_numeric_type/ensure_result_numeric_type.1.adm
new file mode 100644
index 0000000..9f55b2c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/ensure_result_numeric_type/ensure_result_numeric_type.1.adm
@@ -0,0 +1 @@
+3.0
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 591d441..18455df 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -4582,6 +4582,13 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="misc">
+      <compilation-unit name="ensure_result_numeric_type">
+        <output-dir compare="Text">ensure_result_numeric_type</output-dir>
+        <source-location>false</source-location>
+        <expected-error>expected &lt; 3.0</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="misc">
       <compilation-unit name="partition-by-nonexistent-field">
         <output-dir compare="Text">partition-by-nonexistent-field</output-dir>
         <expected-error>Field "id" is not found</expected-error>
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
index 0b2e94c..5fd7892 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/NumberUtils.java
@@ -116,4 +116,49 @@
 
     private NumberUtils() {
     }
+
+    /**
+     * Checks if 2 strings are numeric and of the same type
+     * @param value1 first string value
+     * @param value2 second string value
+     * @return {@code true} if value1 and value2 are numeric values and of the same type, {@code false} otherwise
+     */
+    public static boolean isSameTypeNumericStrings(String value1, String value2) {
+        // Step 1: Confirm numeric strings
+        if (isNumericString(value1) && isNumericString(value2)) {
+            // Step 2: Confirm same type (2 ints or 2 floats = true, otherwise false)
+            return isIntegerNumericString(value1) == isIntegerNumericString(value2);
+        }
+
+        // Not numeric string
+        return false;
+    }
+
+    /**
+     * Checks if a string is a numeric value
+     * @param value string to be checked
+     * @return {@code true} if the string is a valid number, {@code false} otherwise
+     */
+    public static boolean isNumericString(String value) {
+        try {
+            Double.parseDouble(value);
+            return true;
+        } catch (NumberFormatException ignored) {
+            return false;
+        }
+    }
+
+    /**
+     * Checks if a numeric string is of type int
+     * @param value numeric string value
+     * @return {@code true} if the string is of type int, {@code false} otherwise
+     */
+    public static boolean isIntegerNumericString(String value) {
+        try {
+            Integer.parseInt(value);
+            return true;
+        } catch (NumberFormatException ignored) {
+            return false;
+        }
+    }
 }
