字节转GB/TB计算结果不准确,如何修复该JavaScript函数?
修复字节转GB/TB的JavaScript函数
原函数的核心问题是混淆了两种存储单位的进制:
- 你预期的是十进制单位(GB/TB,每级递进1000,1GB=10^9字节),这是存储厂商常用的标注方式;
- 但原代码用了二进制单位(GiB/TiB,每级递进1024,1GiB=2^30字节),所以计算结果和预期完全不符。
另外原代码还有个小笔误:返回Bytes时多写了一个右括号。
方案1:转换为十进制单位(GB/TB,1000进制)
这是匹配你预期结果的修复版本:
function bytesToSize(bytes) { const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; if (bytes === 0) return 'n/a'; // 按10^3递进计算单位索引,用log10更直观 const i = parseInt(Math.floor(Math.log10(bytes) / 3), 10); // 防止索引超出数组长度 const clampedI = Math.min(i, sizes.length - 1); if (clampedI === 0) return `${bytes} ${sizes[clampedI]}`; // 用1000的幂次计算转换后的值 return `${(bytes / (1000 ** clampedI)).toFixed(2)} ${sizes[clampedI]}`; } // 测试你的示例 console.log(bytesToSize(2550024023)); // 输出 2.55 GB console.log(bytesToSize(255002400023)); // 输出 255.00 GB
方案2:转换为二进制单位(GiB/TiB,1024进制)
如果是需要操作系统显示的二进制存储单位(比如电脑属性里的磁盘容量),只需修正原代码的小问题并优化边界处理:
function bytesToSizeBinary(bytes) { const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB']; if (bytes === 0) return 'n/a'; // 处理bytes=1的情况,避免log(0)报错 const logVal = bytes === 1 ? 0 : Math.log(bytes) / Math.log(1024); const i = parseInt(Math.floor(logVal), 10); const clampedI = Math.min(i, sizes.length - 1); if (clampedI === 0) return `${bytes} ${sizes[clampedI]}`; return `${(bytes / (1024 ** clampedI)).toFixed(2)} ${sizes[clampedI]}`; } console.log(bytesToSizeBinary(2550024023)); // 输出 2.37 GiB(原代码的结果是正确的二进制单位值)
内容的提问来源于stack exchange,提问作者Telirw
相关产品推荐
相关产品推荐

