Arch's patch, and a fix for the "number" game's test.
--- bsdgames-2.17.orig/number/number.c
+++ bsdgames-2.17/number/number.c
@@ -78,9 +78,9 @@

 void	convert(char *);
 int	main(int, char *[]);
-int	number(const char *, int);
-void	pfract(int);
-int	unit(int, const char *);
+int	number(const char *, int, int *);
+void	pfract(int, int);
+int	unit(int, const char *, int *);
 void	usage(void) __attribute__((__noreturn__));

 int lflag;
@@ -131,7 +131,7 @@
 convert(line)
	char *line;
 {
-	int flen, len, rval;
+	int flen, len, rval, singular;
	char *p, *fraction;

	flen = 0;
@@ -174,7 +174,7 @@
		--len;
	}

-	rval = len > 0 ? unit(len, line) : 0;
+	rval = len > 0 ? unit(len, line, &singular) : 0;
	if (fraction != NULL && flen != 0)
		for (p = fraction; *p != '\0'; ++p)
			if (*p != '0') {
@@ -182,10 +182,10 @@
					(void)printf("%sand%s",
					    lflag ? " " : "",
					    lflag ? " " : "\n");
-				if (unit(flen, fraction)) {
+				if (unit(flen, fraction, &singular)) {
					if (lflag)
						(void)printf(" ");
-					pfract(flen);
+					pfract(flen, singular);
					rval = 1;
				}
				break;
@@ -197,9 +197,10 @@
 }

 int
-unit(len, p)
+unit(len, p, singular)
	int len;
	const char *p;
+	int *singular;
 {
	int off, rval;

@@ -208,7 +209,7 @@
		if (len % 3) {
			off = len % 3;
			len -= off;
-			if (number(p, off)) {
+			if (number(p, off, singular)) {
				rval = 1;
				(void)printf(" %s%s",
				    name3[len / 3], lflag ? " " : ".\n");
@@ -217,14 +218,16 @@
		}
		for (; len > 3; p += 3) {
			len -= 3;
-			if (number(p, 3)) {
+			if (number(p, 3, singular)) {
				rval = 1;
				(void)printf(" %s%s",
				    name3[len / 3], lflag ? " " : ".\n");
			}
		}
	}
-	if (number(p, len)) {
+	if (number(p, len, singular)) {
+		if (rval)
+			*singular = 0;
		if (!lflag)
			(void)printf(".\n");
		rval = 1;
@@ -233,17 +236,20 @@
 }

 int
-number(p, len)
+number(p, len, singular)
	const char *p;
	int len;
+	int *singular;
 {
	int val, rval;

	rval = 0;
+	*singular = 1;
	switch (len) {
	case 3:
		if (*p != '0') {
			rval = 1;
+			*singular = 0;
			(void)printf("%s hundred", name1[*p - '0']);
		}
		++p;
@@ -262,33 +268,42 @@
			}
			rval = 1;
		}
+		if (val != 1)
+			*singular = 0;
		break;
	case 1:
		if (*p != '0') {
			rval = 1;
			(void)printf("%s", name1[*p - '0']);
		}
+		if (*p != '1')
+			*singular = 0;
	}
	return (rval);
 }

 void
-pfract(len)
+pfract(len, singular)
	int len;
+	int singular;
 {
	static const char *const pref[] = { "", "ten-", "hundred-" };

	switch(len) {
	case 1:
-		(void)printf("tenths.\n");
+		(void)printf("tenth");
		break;
	case 2:
-		(void)printf("hundredths.\n");
+		(void)printf("hundredth");
		break;
	default:
-		(void)printf("%s%sths.\n", pref[len % 3], name3[len / 3]);
+		(void)printf("%s%sth", pref[len % 3], name3[len / 3]);
		break;
	}
+	if (!singular) {
+		printf("s");
+	}
+	printf(".\n");
 }

 void
diff -Naur bsd-games-2.17/tests/number.-0.1 bsd-games-patch/tests/number.-0.1
--- bsd-games-2.17/tests/number.-0.1	1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.-0.1	2020-04-17 15:14:27.831098084 +0700
@@ -1,3 +1,3 @@
 minus
 one.
-tenths.
+tenth.
diff -Naur bsd-games-2.17/tests/number.-0.2 bsd-games-patch/tests/number.-0.2
--- bsd-games-2.17/tests/number.-0.2	1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.-0.2	2020-04-17 15:20:48.162336279 +0700
@@ -0,0 +1,3 @@
+minus
+two.
+tenths.
diff -Naur bsd-games-2.17/tests/number.test bsd-games-patch/tests/number.test
--- bsd-games-2.17/tests/number.test	1970-01-01 07:00:00.000000000 +0700
+++ bsd-games-patch/tests/number.test	2020-04-17 15:20:22.774654155 +0700
@@ -36,6 +36,8 @@
 testno 1
 number/number -- -0.1 >test.out 2>&1 || failtest
 compare test.out tests/number.-0.1
+number/number -- -0.2 >test.out 2>&1 || failtest
+compare test.out tests/number.-0.2
 rm -f test.out

 testno 2
