diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 8f80d9e..37fe31b 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -746,6 +746,8 @@ float8_timestamptz(PG_FUNCTION_ARGS)
 {
 	float8		seconds = PG_GETARG_FLOAT8(0);
 	TimestampTz result;
+	int64       epoch_diff_seconds;
+	int64       microseconds;
 
 	/* Deal with NaN and infinite inputs ... */
 	if (isnan(seconds))
@@ -775,13 +777,15 @@ float8_timestamptz(PG_FUNCTION_ARGS)
 					(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
 					 errmsg("timestamp out of range: \"%g\"", seconds)));
 
+		microseconds = (int64)(seconds * USECS_PER_SEC);
+
 		/* Convert UNIX epoch to Postgres epoch */
-		seconds -= ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+		epoch_diff_seconds = ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
 
 #ifdef HAVE_INT64_TIMESTAMP
-		result = seconds * USECS_PER_SEC;
+		result = microseconds - (epoch_diff_seconds * USECS_PER_SEC);
 #else
-		result = seconds;
+		result = seconds - epoch_diff_seconds;
 #endif
 
 		/* Recheck in case roundoff produces something just out of range */
