diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index f2784da3605b9126d373647cd3560e83af9f9f6f..81b76314de924ce2cc29f4075b6b68bedd8b02b0 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -788,7 +788,7 @@ float8_timestamptz(PG_FUNCTION_ARGS)
 		seconds -= ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
 
 #ifdef HAVE_INT64_TIMESTAMP
-		result = seconds * USECS_PER_SEC;
+		result = rint(seconds * USECS_PER_SEC);
 #else
 		result = seconds;
 #endif
@@ -1623,12 +1623,14 @@ make_interval(PG_FUNCTION_ARGS)
 	result->month = years * MONTHS_PER_YEAR + months;
 	result->day = weeks * 7 + days;
 
-	secs += hours * (double) SECS_PER_HOUR + mins * (double) SECS_PER_MINUTE;
-
 #ifdef HAVE_INT64_TIMESTAMP
-	result->time = (int64) (secs * USECS_PER_SEC);
+	result->time = hours * ((int64) SECS_PER_HOUR * USECS_PER_SEC) +
+		mins * ((int64) SECS_PER_MINUTE * USECS_PER_SEC) +
+		(int64) rint(secs * USECS_PER_SEC);
 #else
-	result->time = secs;
+	result->time = hours * (double) SECS_PER_HOUR +
+		mins * (double) SECS_PER_MINUTE +
+		secs;
 #endif
 
 	PG_RETURN_INTERVAL_P(result);