diff --git a/base/disk_units.cc b/base/disk_units.cc index 8e5faf1..04de8ad 100644 --- a/base/disk_units.cc +++ b/base/disk_units.cc @@ -53,13 +53,35 @@ base::disk_unit_multiplier(disk_unit u) return 1; } + +namespace { + bool small_enough(unsigned long long n) { + if (n > 1024ull * 1024ull) + return false; + + if (n < 1024ull) + return true; + + return (n & 1023) && (n < 8ull * 1024ull); + } + + unsigned long long round_ull(unsigned long long n, unsigned long long d) { + return round(static_cast(n) / static_cast(d)); + } +} + string base::format_disk_unit(unsigned long long numerator, disk_unit u) { numerator *= disk_unit_multiplier(u); unsigned i; - for (i = 0; numerator >= 1024; i++) - numerator /= 1024; + for (i = 0; numerator > 1024ull * 1024ull; i++) + numerator /= 1024ull; + + if (numerator > 8 * 1024ull) { + numerator = round_ull(numerator, 1024ull); + i++; + } char const *extensions[] = { "", "KiB", "MiB", "GiB", "TiB", "PiB"