diff --git a/src/command.c b/src/command.c
index dbdaceab5560f21aa2229d9e2ecaaef69b97c224..cb6803b571cc70a37c015caa91a430be265396ee 100644
--- a/src/command.c
+++ b/src/command.c
@@ -823,8 +823,13 @@ static void COM_Help_f(void)
 					if (!stricmp(cvar->PossibleValue[MINVAL].strvalue, "MIN"))
 					{
 						if (floatmode)
-							CONS_Printf("  range from %f to %f\n", FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value),
-								FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value));
+						{
+							float fu = FIXED_TO_FLOAT(cvar->PossibleValue[MINVAL].value);
+							float ck = FIXED_TO_FLOAT(cvar->PossibleValue[MAXVAL].value);
+							CONS_Printf("  range from %ld%s to %ld%s\n",
+									(long)fu, M_Ftrim(fu),
+									(long)ck, M_Ftrim(ck));
+						}
 						else
 							CONS_Printf("  range from %d to %d\n", cvar->PossibleValue[MINVAL].value,
 								cvar->PossibleValue[MAXVAL].value);
@@ -973,7 +978,10 @@ static void COM_Add_f(void)
 	}
 
 	if (( cvar->flags & CV_FLOAT ))
-		CV_Set(cvar, va("%f", FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2))));
+	{
+		float n =FIXED_TO_FLOAT (cvar->value) + atof(COM_Argv(2));
+		CV_Set(cvar, va("%ld%s", (long)n, M_Ftrim(n)));
+	}
 	else
 		CV_AddValue(cvar, atoi(COM_Argv(2)));
 }
diff --git a/src/m_menu.c b/src/m_menu.c
index 0915f17bf6720b9ab9e6c24c30dd4f9d942ab0a8..dbe5d854f690e4e97acfb84bf91c342990fde456 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -3030,7 +3030,8 @@ static void M_ChangeCvar(INT32 choice)
 			|| !(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP))
 		{
 			char s[20];
-			sprintf(s,"%f",FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f));
+			float n = FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f);
+			sprintf(s,"%ld%s",(long)n,M_Ftrim(n));
 			CV_Set(cv,s);
 		}
 		else
diff --git a/src/m_misc.c b/src/m_misc.c
index 3026f66548c88bf33d06e64701c891e69db25d20..3dfeef81ec941129cadbdfd145394e1ad49f8452 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -2612,3 +2612,20 @@ int M_JumpWordReverse(const char *line, int offset)
 		offset--;
 	return offset;
 }
+
+const char * M_Ftrim (double f)
+{
+	static char dig[9];/* "0." + 6 digits (6 is printf's default) */
+	int i;
+	/* I know I said it's the default, but just in case... */
+	sprintf(dig, "%.6g", modf(f, &f));
+	if (dig[0])
+	{
+		for (i = strlen(dig); dig[i] == '0'; --i)
+			;
+		dig[i + 1] = '\0';
+		return &dig[1];/* skip the 0 */
+	}
+	else
+		return "";
+}
diff --git a/src/m_misc.h b/src/m_misc.h
index 3fb9f031a460f007e4d539837905072547b367fd..ad12517c18782b63793effbfd4a009d2bda4e9b0 100644
--- a/src/m_misc.h
+++ b/src/m_misc.h
@@ -109,6 +109,12 @@ int M_JumpWord (const char *s);
 /* E.g. cursor = M_JumpWordReverse(line, cursor); */
 int M_JumpWordReverse (const char *line, int offset);
 
+/*
+Return dot and then the fractional part of a float, without
+trailing zeros, or "" if the fractional part is zero.
+*/
+const char * M_Ftrim (double);
+
 // counting bits, for weapon ammo code, usually
 FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);