diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 9bbd0b1..eca14e6 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -4670,12 +4670,6 @@ numeric_to_char(PG_FUNCTION_ARGS)
 
 		numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
 		len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*e", Num.post, val);
-		if (len > Num.pre + Num.post + 5)
-		{
-			numstr = (char *) palloc(Num.pre + Num.post + 6);
-			fill_str(numstr, '#', Num.pre + Num.post + 5);
-			*(numstr + Num.pre) = '.';
-		}
 	}
 	else
 	{
@@ -4936,6 +4930,10 @@ float4_to_char(PG_FUNCTION_ARGS)
 		numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
 		if (isnan(value) || is_infinite(value))
 		{
+			/*
+			 * Allow 5 characters for the decimal point, "E", the sign
+			 * specifier and two exponent digits.
+			 */
 			numstr = (char *) palloc(Num.pre + Num.post + 6);
 			fill_str(numstr, '#', Num.pre + Num.post + 5);
 			*(numstr + Num.pre) = '.';
@@ -5021,14 +5019,18 @@ float8_to_char(PG_FUNCTION_ARGS)
 	else if (IS_EEEE(&Num))
 	{
 		numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
-		len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*e", Num.post, value);
-
-		if (isnan(value) || is_infinite(value) || len > Num.pre + Num.post + 5)
+		if (isnan(value) || is_infinite(value))
 		{
+			/*
+			 * Allow 5 characters for the decimal point, "e", the sign
+			 * specifier and two exponent digits.
+			 */
 			numstr = (char *) palloc(Num.pre + Num.post + 6);
 			fill_str(numstr, '#', Num.pre + Num.post + 5);
 			*(numstr + Num.pre) = '.';
 		}
+		else
+			snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*e", Num.post, value);
 	}
 	else
 	{
