progress bar: round to the nearest instead of truncating down
authorNicolas Pitre <nico@cam.org>
Fri, 24 Apr 2009 21:46:15 +0000 (17:46 -0400)
committerJunio C Hamano <gitster@pobox.com>
Sat, 25 Apr 2009 15:54:18 +0000 (08:54 -0700)
Often the throughput output is requested when the data read so far is
one smaller than multiple of 1024; because 1023/1024 is ~0.999, it often
shows up as 0.99 because the code currently truncates.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
progress.c

index 55a8687ad15788f8ea5a5beb463d216908f618b2..621c34edc2a3a6a9bceb0f708ed5b0df05145fb5 100644 (file)
@@ -121,13 +121,13 @@ static void throughput_string(struct throughput *tp, off_t total,
                              (int)(total >> 30),
                              (int)(total & ((1 << 30) - 1)) / 10737419);
        } else if (total > 1 << 20) {
+               int x = total + 5243;  /* for rounding */
                l -= snprintf(tp->display, l, ", %u.%2.2u MiB",
-                             (int)(total >> 20),
-                             ((int)(total & ((1 << 20) - 1)) * 100) >> 20);
+                             x >> 20, ((x & ((1 << 20) - 1)) * 100) >> 20);
        } else if (total > 1 << 10) {
+               int x = total + 5;  /* for rounding */
                l -= snprintf(tp->display, l, ", %u.%2.2u KiB",
-                             (int)(total >> 10),
-                             ((int)(total & ((1 << 10) - 1)) * 100) >> 10);
+                             x >> 10, ((x & ((1 << 10) - 1)) * 100) >> 10);
        } else {
                l -= snprintf(tp->display, l, ", %u bytes", (int)total);
        }