如何以 GB 为单位输出磁盘大小且不产生舍入误差?

如何以 GB 为单位输出磁盘大小且不产生舍入误差?

仅以 GB 为单位输出磁盘大小。仅以千兆字节为单位。
不是 MB。不是兆字节。
不是 TB。不是太字节。

迄今已测试:

sudo blockdev --getsize64 /dev/sda
1000204886016

sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}'
1000.2

sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}' |numfmt --field=1- --format=%.0f --invalid=ignore
1001

但上面的1001输出是舍入误差。
1000是理想输出,即1000 GB磁盘大小。

问题1:
如何修复上述舍入误差?

问题 2:
与下面的 120 个字符相比,有什么更优雅的方式或更短的方式:
sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}' |numfmt --field=1- --format=%.0f --invalid=ignore


使用:
neofetch --stdout |grep 'OS:'

操作系统:Kubuntu 22.04.3 LTS x86_64

--

答案1

严格来说,这不是舍入误差根据 numfmt 使用的舍入方法,其中有几种。您需要选择所需的舍入行为,可能--round=nearest是大多数人期望的行为:

   --round=METHOD
          use METHOD for rounding when scaling; METHOD can be: up,
          down, from-zero (default), towards-zero, nearest

但是由于您只想要一个特定的单位(GB),在您使用 awk 完成除法之后,numfmt 在这里完全是多余的——它为您做的就是添加“G”,并且您已经可以从 awk 本身完成此操作,也可以使用 awk 自己的浮点数(甚至整数)格式,其中%.0f始终使用最接近的舍入(和%d截断)。

$ blockdev --getsize64 /dev/sda | awk '{printf("%.0f GB\n", $1/1000000000)}'
1000 GB

在您的示例中,这bc -l似乎是多余的,因为您实际上并没有在“bc”中执行任何操作,但是您可以也可以使用它:

$ sz=$(blockdev --getsize64 /dev/sda); echo "$sz/1000000000" | bc

如果截断(向下舍入)足够好,您还可以在$(( ... ))$[...](相同但后者是非标准的)内使用 Bash 的整数算法:

$ sz=$(blockdev --getsize64 /dev/sda); echo "$[sz/1000000000]G"

相关内容