| Files | Last commit | Last update |
|---|---|---|
| 18 days ago | ||
| 18 days ago | ||
| 18 days ago |
500GB 硬盘只有 465GB,100M 宽带只有 12.5MB/s:单位进制实测
买回来一块 500GB 的硬盘,装进系统只显示 465GB。
办了一条 100M 的宽带,测速只有 12.5MB/s。
两个数字都不是虚标,是两套单位进制在打架。
我把这两件事做成一个单文件网页,里面有容量换算器、硬盘标称对照表、网速换算器和一张 SI 与 IEC 的逐级对照表,右上角还有 10 项自检,加载时自己跑一遍,结果是 10/10 通过。

在线案例与源码:https://atomgit.com/deli007/demo_park/tree/main/codearts-data-unit-lab 成品只有一个 index.html,双击就能打开。下面每个数字都是我在页面里读回来的。
一、为什么值得看:同一个字节数,怎么算出两个数字
硬盘厂商按 SI 十进制标称,1 GB 就是 10 的 9 次方,等于 1,000,000,000 字节。
系统按 IEC 二进制统计,1 GiB 是 2 的 30 次方,等于 1,073,741,824 字节。
500 GB 换成 GiB 要除以 1,073,741,824,得数 465.66。
字节一个没少,只是换了一套进制去读,读出来的数字就变小了。
Windows 沿用旧写法,把 GiB 直接标成 "GB",这一步最容易被当成故障。
宽带那边的 M 是 Mbps,是位;下载速度用的 MB/s,是字节。
一字节等于 8 位,100 Mbps 除以 8 才是 12.5 MB/s。
二、准备环境:进入码道 Web
浏览器打开码道 Web 版:https://devcloud.cn-north-4.huaweicloud.com/chat?source=dmzntgwsf&sourcead=dmzntgwwbwz ,登录后在对话框里写需求,就能拿到一个能跑的单文件应用,不用装软件。
码道有三种使用方式:WebUI(浏览器对话)、TUI(终端命令行)和桌面 IDE(IDE 插件)。本文用 WebUI 版演示。
三、需求原文:把要算的数字写死在需求里
这一轮我把关键数字全部写进了需求,不让模型自己去回忆。
六行硬盘对照的期望值、四档宽带的期望值、10 条自检断言,一条条列在需求里。
需求原文如下,可以直接复制。
做一个单文件网页应用「数据单位换算实验室」,只需要一个 index.html,不引入任何外部依赖、不用 CDN、不发任何网络请求,所有计算都在浏览器本地完成,界面用中文。
要讲清楚两件事:为什么 500GB 的硬盘在系统里只显示 465GB;为什么 100M 宽带下载速度只有 12.5MB/s。
必须包含下面 5 个面板:
1) 容量换算器:输入数字 + 单位下拉(B / KB / MB / GB / TB / PB / KiB / MiB / GiB / TiB / PiB),同时输出精确字节数、SI 十进制表示的 KB/MB/GB/TB、IEC 二进制表示的 KiB/MiB/GiB/TiB。GB 走 1000 进制,GiB 走 1024 进制。
2) 硬盘标称 vs 系统显示对照表:128GB、256GB、500GB、1TB、2TB、4TB 六行,列出标称字节数、系统显示的 GiB、看起来少了多少 GB。数字必须算准:500GB=500000000000 字节=465.66 GiB;1TB=931.32 GiB;128GB=119.21 GiB;256GB=238.42 GiB;2TB=1862.65 GiB;4TB=3725.29 GiB。
3) 网速换算器:输入 Mbps,输出 MB/s(= Mbps ÷ 8),以及下载 1GB 和 1GiB 文件各需要多少秒;再给一张 100M / 300M / 500M / 1000M 四档对照表。
4) 单位进制对照表:把 SI(KB=1000、MB、GB、TB、PB)和 IEC(KiB=1024、MiB、GiB、TiB、PiB)逐级并排对照,每级都给出对应的字节数。
5) 常见坑清单,以及一个自检面板:页面加载时逐条运行 10 条断言,并显示每条通过或失败和实际计算值。
交互要求:当用户输入非法内容(例如 -5、abc、留空)时,对应面板里要用红色文字提示「请输入一个非负数字」,不显示任何结果数字,不能出现 NaN 或 Infinity。
完成后打开预览,让我直接看到运行效果。
四、一屏五块
页面从上往下是五块。
第一块是容量换算器,输入数字加单位,同时给出精确字节数和 SI、IEC 两套结果。
第二块是硬盘标称对照表,六行,从 128GB 排到 4TB。
第三块是网速换算器,输入 Mbps,输出 MB/s 和下载 1GB、1GiB 的耗时。
第四块是 SI 与 IEC 逐级对照表,从 KB 一路排到 PB。
第五块是常见坑清单,收的都是看着像故障、其实是单位混用的情况。
五、实测:容量换算与六行对照表
输入 500、单位选 GB,点换算,页面给的精确字节数是 500,000,000,000 字节。
换成 IEC 是 465.661287 GiB,SI 侧一行行读下来是 500,000,000 KB、500,000 MB、500 GB、0.5 TB。
这个数是 BigInt 算的,页面里读回来是整整齐齐的 500,000,000,000,没有出现科学计数法。

硬盘标称那一块是六行固定对照,我把它整张抄下来。
| 标称容量 | 标称字节数 | 系统显示的 GiB | 看起来少了多少 GB |
|---|---|---|---|
| 128 GB | 128,000,000,000 | 119.21 GiB | 8.79 GB |
| 256 GB | 256,000,000,000 | 238.42 GiB | 17.58 GB |
| 500 GB | 500,000,000,000 | 465.66 GiB | 34.34 GB |
| 1 TB | 1,000,000,000,000 | 931.32 GiB | 68.68 GB |
| 2 TB | 2,000,000,000,000 | 1,862.65 GiB | 137.35 GB |
| 4 TB | 4,000,000,000,000 | 3,725.29 GiB | 274.71 GB |
最右一列就是同一个字节数在两套进制下的差,容量本身一个字节都没丢。

六、网速那一块:100M 为什么只有 12.5 MB/s
输入 100,页面给出 100 Mbps = 12.5 MB/s。
下载 1GB(1,000,000,000 字节)要 80.0 秒,下载 1GiB(1,073,741,824 字节)要 85.9 秒。
四档带宽它并排列出来了。
| 带宽档位 | MB/s | 下载 1GiB 耗时 |
|---|---|---|
| 100M 宽带 | 12.5 MB/s | 85.9 秒(1 分 25.9 秒) |
| 300M 宽带 | 37.5 MB/s | 28.6 秒 |
| 500M 宽带 | 62.5 MB/s | 17.2 秒 |
| 1000M 宽带 | 125 MB/s | 8.6 秒 |
1000M 也只有 125 MB/s,除以 8 这一步没有例外。

12.5 MB/s 是理论上限,页面自己也标了一句:TCP/IP 协议头、Wi-Fi 衰减、路由损耗都会再打折,一般再打 8 到 9 折。
七、验证与踩坑:非法输入、科学计数法和一个 24 位整数
那 10 项自检是页面加载时现场跑的,这次读回来是 10/10 通过。
我把每一项的实际值都核对了一遍:1 GiB 是 1073741824 字节,1 TiB 是 1099511627776 字节,12 MB/s 等于 96 Mbps,100 Mbps 等于 12.5 MB/s。
失败路径我拿 -5 试的,页面给出红色提示,原文是「请输入一个非负数字」,同时把结果区收了起来,没有输出 NaN,也没有 Infinity。
abc、留空、只敲一个空格,走的是同一条拦截路径。

踩到的第一个真边界是科学计数法:输入 1e6 会被拦掉,这个换算器只认普通数字和小数写法。
第二个是超长整数:我输入 24 个 9,页面输出 999999999999999999999999000000000 字节,一位不差。
浮点算这个数会掉精度,页面在这一步用了 BigInt。
第三个是小数:输入 0.5 得到 500,000,000 字节,换算器吃小数,但不做四舍五入展示。
八、边界与取舍
下面几条是我这一轮实测出来的真边界。
第一,对照表里那列「少了多少 GB」只算两套进制之差,不含格式化开销。
真机上 NTFS、exFAT 的元数据、RAID 冗余、SSD 预留空间还会再吃掉一部分,页面没有把这一层算进去。
第二,网速换算给的是理论上限,页面自己标了实测通常再打 8 到 9 折。
第三,科学计数法输入被拒,只认十进制写法,这是刻意的,免得把 1e6 读成 1000000 之后又和用户预期不一致。
第四,自检只在页面加载时跑一次,不是持续监控。
第五,内存那一条我按页面说法写:内存颗粒按 2 进制制造,8GB 内存就是 8 GiB,不缩水。
九、使用码道的体会
- 把六行对照的期望值写进需求,生成出来的表第一版就对,省掉了来回核对。
- 断言要写成「页面自己报数」,10/10 这种数字比「测试通过」四个字可信。
- 非法输入的提示原文要写进需求,这一条让失败路径有了能核对的东西。
- 数字一律标注单位,页面上每一行都带 GB、GiB、MB/s,读起来不起歧义。
- 布局上我让它一屏放下,截图时不用来回滚。
一句实在的话:码道把可运行的第一版做得很快,但这个页面能不能当换算尺用,取决于你把验收数字写得多具体。
十、直接下载试玩
这个 Demo 已经完整开源,源代码、本文档、五张截图都在公开仓库里。
- Demo Park 仓库:https://atomgit.com/deli007/demo_park
- 本案例目录:https://atomgit.com/deli007/demo_park/tree/main/codearts-data-unit-lab
把 index.html 下载到本地,用浏览器打开,就能自己改输入、切单位,看着两套进制一起变。
十一、本地复现与下一步
本地跑两步就够。
git clone https://atomgit.com/deli007/demo_park.git
cd demo_park\codearts-data-unit-lab
python -m http.server 8080
浏览器打开 http://localhost:8080/index.html ,把输入从 500 换成 1000,能看到 GiB 那一列从 465.66 变成 931.32。
下一步我打算补两件事:一是给容量换算器加上文件系统开销的估算,把格式化之后真正可用的容量也算出来;二是把内存、显存、流量这几个场景的单位混用也收进常见坑清单。