Commit 087f38f3476 for php.net

commit 087f38f3476b2f6c73cf2567ccbe19636c2c975d
Author: Oleg Efimov <o.efimov@team.bumble.com>
Date:   Thu May 29 21:46:11 2025 +0100

    Fix GH-18695: float numbers zero fraction is now preserved in zend_ast_export() (#18699)

diff --git a/NEWS b/NEWS
index 466ba5d8965..379718ba2a9 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? ????, PHP 8.3.23

+- Core:
+  . Fixed GH-18695 (zend_ast_export() - float number is not preserved).
+    (Oleg Efimov)
+
 - Date:
   . Fix leaks with multiple calls to DatePeriod iterator current(). (nielsdos)

diff --git a/Zend/tests/ast/ast_serialize_floats.phpt b/Zend/tests/ast/ast_serialize_floats.phpt
new file mode 100644
index 00000000000..164b8b03338
--- /dev/null
+++ b/Zend/tests/ast/ast_serialize_floats.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Serialization of floats are correct
+--INI--
+zend.assertions=1
+--FILE--
+<?php
+try {
+    assert(!is_float(0.0));
+} catch (AssertionError $e) {
+    echo 'assert(): ', $e->getMessage(), ' failed', PHP_EOL;
+}
+try {
+    assert(!is_float(1.1));
+} catch (AssertionError $e) {
+    echo 'assert(): ', $e->getMessage(), ' failed', PHP_EOL;
+}
+try {
+    assert(!is_float(1234.5678));
+} catch (AssertionError $e) {
+    echo 'assert(): ', $e->getMessage(), ' failed', PHP_EOL;
+}
+?>
+--EXPECT--
+assert(): assert(!is_float(0.0)) failed
+assert(): assert(!is_float(1.1)) failed
+assert(): assert(!is_float(1234.5678)) failed
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 0fb50e2eae1..f8c4ca17a9b 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -1563,7 +1563,7 @@ static ZEND_COLD void zend_ast_export_zval(smart_str *str, zval *zv, int priorit
 			break;
 		case IS_DOUBLE:
 			smart_str_append_double(
-				str, Z_DVAL_P(zv), (int) EG(precision), /* zero_fraction */ false);
+				str, Z_DVAL_P(zv), (int) EG(precision), /* zero_fraction */ true);
 			break;
 		case IS_STRING:
 			smart_str_appendc(str, '\'');