diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 49547ee..7aeeb9d 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -47,6 +47,16 @@
     </para>
 
     <para>
+     If a memory or time setting is specified with more precision than the
+     implicit unit of the setting, it is rounded down. However, zero has
+     special meaning in some parameters, so if rounding down non-zero value
+     would yield a zero, it raise an error. For example, the implicit unit
+     of <vername>log_rotation_age</varname> is minutes, and if you set it to
+     <literal>150s</literal>, it will be rounded down to two minutes.
+     if you set it to <literal>10s</literal>, you will get an error.
+    </para>
+
+    <para>
      Parameters of type <quote>enum</> are specified in the same way as string
      parameters, but are restricted to a limited set of values.  The allowed
      values can be found
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index af667f5..4e39325 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -5126,10 +5126,28 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg)
 				switch (flags & GUC_UNIT_TIME)
 				{
 					case GUC_UNIT_S:
-						val /= MS_PER_S;
+						if (val > 0)
+						{
+							val /= MS_PER_S;
+							if (val == 0)
+							{
+								if (hintmsg)
+									*hintmsg = gettext_noop("The value is less than the required unit(second).");
+								return false;
+							}
+						}
 						break;
 					case GUC_UNIT_MIN:
-						val /= MS_PER_MIN;
+						if (val > 0)
+						{
+							val /= MS_PER_MIN;
+							if (val == 0)
+							{
+								if (hintmsg)
+									*hintmsg = gettext_noop("The value is less than the required unit(minute).");
+								return false;
+							}
+						}
 						break;
 				}
 			}
@@ -5142,7 +5160,16 @@ parse_int(const char *value, int *result, int flags, const char **hintmsg)
 						val *= MS_PER_S;
 						break;
 					case GUC_UNIT_MIN:
-						val /= S_PER_MIN;
+						if (val > 0)
+						{
+							val /= S_PER_MIN;
+							if (val == 0)
+							{
+								if (hintmsg)
+									*hintmsg = gettext_noop("The value is less than the required unit(minute).");
+								return false;
+							}
+						}
 						break;
 				}
 			}
