diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
index 0c384def7b60e17a0c0dc03bce0fc83d23d9389e..5f3a5415cec11a5b0b7e0d8a2d67da04cd7cfe01 100644
--- a/src/backend/catalog/pg_enum.c
+++ b/src/backend/catalog/pg_enum.c
@@ -287,6 +287,16 @@ restart:
 			other_nbr_en = (Form_pg_enum) GETSTRUCT(existing[other_nbr_index]);
 			newelemorder = (nbr_en->enumsortorder +
 							other_nbr_en->enumsortorder) / 2;
+
+			/*
+			 * On some machines, newelemorder may be in a register that's
+			 * wider than float4.  We need to force it to be rounded to
+			 * float4 precision before making the following comparisons,
+			 * or we'll get wrong results.  (Such behavior violates the C
+			 * standard, but fixing the compilers is out of our reach.)
+			 */
+			newelemorder = DatumGetFloat4(Float4GetDatum(newelemorder));
+
 			if (newelemorder == nbr_en->enumsortorder ||
 				newelemorder == other_nbr_en->enumsortorder)
 			{