js计算磁盘已用空间和剩余空间出现误差问题

image.png
如图
直接计算已用空间、剩余空间可能出现图片中的数据总和不匹配的问题,考虑了以下方案,感觉还是有机率出现这种问题

方案1

放弃已用空间的精度,从丢失精度的GB转回kb,再用总空间减去丢失精度的已用空间,得出剩余空间,剩余空间再转最大单位

let totalSize = 12345678;
let usedSize = 225654;
let unUsedSize;

let total = kbToOther(totalSize);  // * 14.7GB 假设
let usedSizeNoAccuracy = total * 1024 * 1024; // * 存在一位小数   = 15414067.2

unUsedSize = totalSize - usedSizeNoAccuracy; // * 存在一位小数    = xxxxx.8
let unUsed = kbToOther(unUsedSize); // * 保留一位,再次丢失精度        = xxxxx.8/1024/1024 .toFixed(1) 

抛弃已用空间的精度来保证总精度,但是由于进制为1024,最后可能会再次丢失剩余空间的精度,仍有一定机率出现相加与总和不一致问题

  • 注:可能出现其他单位,TB/MB/KB
阅读 2.4k
2 个回答

有以下思路:

  • 全部计算结果都用整数,到了显示时候才转换为小数。
  • 采用一些具有高精度的库例如mathjs,能够支持非常高精度的小数运算

这个问题没有完美的解决方法,永远会有类似的问题,这个无论多少位数据精度都不能保证,只要存在四舍五入可能都会有类似情况,因为很可能单个计算时两边都舍弃,加总后恰好进位的情况,比如
1.04+1.01=2.05,在保留1位小数时,两个分量四舍五入都是1.0,但总量四舍五入是2.1
要处理类似问题,其实可以换一种思路,因为已经是约数啦,精度没有那么重要,而且单位值越大,精度越不重要,所以可以考虑为得总的约数,再得已经用的约数,之差为空闲约数,因为是定位减法,不再存在四舍五入,所以相对更准确。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题