diff --git a/src/common/xcgroup_read_config.c b/src/common/xcgroup_read_config.c
index 41386c93ad7458a944fdabfeb98447023a733f89..9a45dd40610c5d810bd53917498c49d840c5ad58 100644
--- a/src/common/xcgroup_read_config.c
+++ b/src/common/xcgroup_read_config.c
@@ -93,6 +93,34 @@ static void _clear_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf)
 	}
 }
 
+/*
+ *   Parse a floating point value in s and return in val
+ *    Return -1 on error and leave *val unchanged.
+ */
+static int str_to_float (char *s, float *val)
+{
+	float f;
+	char *p;
+
+	errno = 0;
+	f = strtof (s, &p);
+
+	if ((*p != '\0') || (errno != 0))
+		return (-1);
+
+	*val = f;
+	return (0);
+}
+
+static void conf_get_float (s_p_hashtbl_t *t, char *name, float *fp)
+{
+	char *str;
+	if (!s_p_get_string(&str, name, t))
+		return;
+	if (str_to_float (str, fp) < 0)
+		fatal ("cgroup.conf: Invalid value '%s' for %s", str, name);
+}
+
 /*
  * read_slurm_cgroup_conf - load the Slurm cgroup configuration from the
  *	cgroup.conf file.
@@ -108,14 +136,14 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf)
 		{"ConstrainCores", S_P_BOOLEAN},
 		{"TaskAffinity", S_P_BOOLEAN},
 		{"ConstrainRAMSpace", S_P_BOOLEAN},
-		{"AllowedRAMSpace", S_P_UINT32},
-		{"MaxRAMPercent", S_P_UINT32},
+		{"AllowedRAMSpace", S_P_STRING},
+		{"MaxRAMPercent", S_P_STRING},
 		{"ConstrainSwapSpace", S_P_BOOLEAN},
-		{"AllowedSwapSpace", S_P_UINT32},
-		{"MaxSwapPercent", S_P_UINT32},
+		{"AllowedSwapSpace", S_P_STRING},
+		{"MaxSwapPercent", S_P_STRING},
 		{"ConstrainCores", S_P_BOOLEAN},
 		{"MemoryLimitEnforcement", S_P_BOOLEAN},
-		{"MemoryLimitThreshold", S_P_UINT32},
+		{"MemoryLimitThreshold", S_P_STRING},
 		{"ConstrainDevices", S_P_BOOLEAN},
 		{"AllowedDevicesFile", S_P_STRING},
 		{NULL} };
@@ -173,33 +201,35 @@ extern int read_slurm_cgroup_conf(slurm_cgroup_conf_t *slurm_cgroup_conf)
 		if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_ram_space,
 				     "ConstrainRAMSpace", tbl))
 			slurm_cgroup_conf->constrain_ram_space = false;
-		if (!s_p_get_uint32(&slurm_cgroup_conf->allowed_ram_space,
-				    "AllowedRAMSpace", tbl))
-			slurm_cgroup_conf->allowed_ram_space = 100;
+
+		conf_get_float (tbl,
+				"AllowedRAMSpace",
+				&slurm_cgroup_conf->allowed_ram_space);
+
+		conf_get_float (tbl,
+				"MaxRAMPercent",
+				&slurm_cgroup_conf->max_ram_percent);
+
 		if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_swap_space,
 				     "ConstrainSwapSpace", tbl))
 			slurm_cgroup_conf->constrain_swap_space = false;
-		if (!s_p_get_uint32(&slurm_cgroup_conf->allowed_swap_space,
-				    "AllowedSwapSpace", tbl))
-			slurm_cgroup_conf->allowed_swap_space = 0;
 
-		if (s_p_get_uint32(&slurm_cgroup_conf->max_ram_percent,
-				    "MaxRAMPercent", tbl)
-		   && (slurm_cgroup_conf->max_ram_percent > 100))
-			fatal ("%s: Invalid MaxRAMPercent\n", conf_path);
+		conf_get_float (tbl,
+				"AllowedSwapSpace",
+				&slurm_cgroup_conf->allowed_swap_space);
 
-		if (s_p_get_uint32(&slurm_cgroup_conf->max_swap_percent,
-				    "MaxSwapPercent", tbl)
-		   && (slurm_cgroup_conf->max_swap_percent > 100))
-			fatal ("%s: Invalid MaxSwapPercent\n", conf_path);
+		conf_get_float (tbl,
+				"MaxSwapPercent",
+				&slurm_cgroup_conf->max_swap_percent);
 
 		/* Memory limits */
 		if (!s_p_get_boolean(&slurm_cgroup_conf->memlimit_enforcement,
 				     "MemoryLimitEnforcement", tbl))
 			slurm_cgroup_conf->memlimit_enforcement = false;
-		if (!s_p_get_uint32(&slurm_cgroup_conf->memlimit_threshold,
-				    "MemoryLimitThreshold", tbl))
-			slurm_cgroup_conf->memlimit_threshold = 0;
+
+		conf_get_float (tbl,
+				"MemoryLimitThreshold",
+				&slurm_cgroup_conf->memlimit_threshold);
 
 		/* Devices constraint related conf items */
 		if (!s_p_get_boolean(&slurm_cgroup_conf->constrain_devices,
diff --git a/src/common/xcgroup_read_config.h b/src/common/xcgroup_read_config.h
index 032129b11e501eff2f8eafc572d92d906831d954..afdd4f054194322f7426dbd6c811afea895c1f95 100644
--- a/src/common/xcgroup_read_config.h
+++ b/src/common/xcgroup_read_config.h
@@ -63,15 +63,15 @@ typedef struct slurm_cgroup_conf {
 	bool      task_affinity;
 
 	bool      constrain_ram_space;
-	uint32_t  allowed_ram_space;
-	uint32_t  max_ram_percent;       /* Upper bound on memory as % of RAM*/
+	float     allowed_ram_space;
+	float     max_ram_percent;       /* Upper bound on memory as % of RAM*/
 
 	bool      constrain_swap_space;
-	uint32_t  allowed_swap_space;
-	uint32_t  max_swap_percent;      /* Upper bound on swap as % of RAM  */
+	float     allowed_swap_space;
+	float     max_swap_percent;      /* Upper bound on swap as % of RAM  */
 
 	bool      memlimit_enforcement;
-	uint32_t  memlimit_threshold;
+	float     memlimit_threshold;
 
 	bool      constrain_devices;
 	char *    allowed_devices_file;
diff --git a/src/plugins/task/cgroup/task_cgroup_memory.c b/src/plugins/task/cgroup/task_cgroup_memory.c
index 1db40e636c92ffdff4d100f4f407393f1c368f99..bb5de6e60a21eb6dcd75a2aad3b60a2386510a4b 100644
--- a/src/plugins/task/cgroup/task_cgroup_memory.c
+++ b/src/plugins/task/cgroup/task_cgroup_memory.c
@@ -66,14 +66,14 @@ static xcgroup_t user_memory_cg;
 static xcgroup_t job_memory_cg;
 static xcgroup_t step_memory_cg;
 
-static int allowed_ram_space;
-static int allowed_swap_space;
+static float allowed_ram_space;   /* Allowed RAM in percent       */
+static float allowed_swap_space;  /* Allowed Swap percent         */
 
 static uint64_t max_ram;        /* Upper bound for memory.limit_in_bytes  */
 static uint64_t max_swap;       /* Upper bound for swap                   */
 static uint64_t totalram;       /* Total real memory available on node    */
 
-static uint64_t percent_in_bytes (uint64_t mb, uint32_t percent)
+static uint64_t percent_in_bytes (uint64_t mb, float percent)
 {
 	return ((mb * 1024 * 1024) * (percent / 100.0));
 }