15 份乐谱 PDF 丢进文件信息页,大小那一列有意见
起因只是存档:两部公有领域乐谱一共 15 份 PDF,想把文件名和大小抄成一张表,就整批丢进了文件信息页。统计条给出 文件总数:15 / 总大小:5.06 MB / 平均大小:345.4 KB,可下面 15 行的大小列一格 MB 都没有,最小那份也没落进 B 档——同一屏两套单位。
被测的是文件信息读取:模板 11104 字节 / 275 个换行、CRLF 0,script 段 6860 字节 167 行自第 108 行起,10 个函数原样进纯 Node 探针、toString 回查逐字命中,阈值没动、Math.round 没摘。
三阈值两精度,顶格还不换档
大小列只由一个 formatSize(第 162–167 行)决定:阈值 1024 / 1048576 / 1073741824,KB 档 toFixed(1)、MB 与 GB 档 toFixed(2),最低的 B 档在第 163 行原样拼接、一位小数都不做。
| 输入字节 | 显示串 | 口径 |
|---|---|---|
| 1023 | 1023 B | B 档不取整 |
| 1024 | 1.0 KB | 换档留 1 位 |
| 1048575 | 1024.0 KB | 顶格不换档 |
| 1048576 | 1.00 MB | 换档留 2 位 |
| 1073741823 | 1024.00 MB | 顶格不换档 |
| 1073741824 | 1.00 GB | 第三档 |
| 1023.9 | 1023.9 B | 小数尾巴照抄 |
我这 15 份全夹在 1024 与 1048576 之间,整列走的是 toFixed(1):最小 42286 → 41.3 KB,距下界还有 41262 字节;最大 897847 → 876.8 KB,距换档还差 150729 字节(约 147.2 KB);MB 档 0 份、B 档 0 份。文案那句「自动换算KB/MB/GB」在这批只兑现中间一档,GB 档从未被触到,漏掉的恰是最低那档 B 与两档精度。
显示串还原回字节:绝对漂移 350
把显示串按档位乘回去(KB 档 ×1024)与真实字节对账:Σ真实 5305582、Σ还原 5305548.8,净漂移 -33.2 字节,逐份绝对漂移之和 350 字节,最大单份 -48——149552 显示 146.0 KB、还原 149504。
- 88176 → 86.1 KB → 88166.4,差 -9.6
- 814854 → 795.8 KB → 814899.2,差 +45.2
- 897847 → 876.8 KB → 897843.2,差 -3.8
净漂移只有 33.2 是靠正负抵消,350 才是这一列抹掉的量。63004 与 62934 更绝:两份都写作 61.5 KB、还原同为 62976,屏幕上分不出来。
图 1:显示串到字节的往返,最坏单份 -48 字节。
平均大小取整两次,只有特定样本才露脸
统计条走第 227–229 行的三步:totalSize 直接累加原始字节,avgSize = Math.round(totalSize / total),这个整数再进 formatSize——同一次显示里两轮取整。舒伯特 12 份的 totalSize 5141254、真实平均 428437.8333333333,round 成 428438,位移 0.16666666668606922 字节,显示 418.4 KB;摘掉 Math.round 仍是 418.4 KB,本批完全看不见第二次取整。
露脸要造样本:5 份共 5376 字节、平均 1075.2,页面写 1.0 KB,不取整是 1.1 KB,真实只差 0.2、显示差一整档小数;4 份共 401 字节、平均 100.25,B 档写 100 B,不取整是 100.25 B。差别在于 B 档不做 toFixed,而 KB 档的步长是 0.1 KB = 102.4 字节,只有真实平均值压在换串线上时那零点几字节才够推过去。
统计行里 MB 与 KB 同屏
三行各进各的 formatSize,单位当场分家:舒伯特是 总大小:4.90 MB 配 平均大小:418.4 KB;15 份合投是 5.06 MB 配 345.4 KB;只有舒曼 3 份两行都在 KB(160.5 KB 配 53.5 KB)。合投的 5305582 正是 5141254 加 164328,与逐份相加闭合——我拖的只有 PDF,目录里那几个附属文本没进来,所以读数是净和;整目录 5161096 与 172148 一起投的话会写成 4.92 MB 与 168.1 KB。
图 2:同一个 5141254,n 从 4 到 5 就把平均行推进另一个单位,总大小行一动不动。
资源页展示字段那两条是「PDF 4.90 MB」与「PDF 0.16 MB」,四舍五入到两位的展示口径,不是实测字节。取舒伯特艺术歌曲那份公有领域乐谱的 12 份净和实测 5141254,而 4.90 MB 还原 5138022.4,差 -3231.6 字节、同档不同串,对整目录 5161096 差 -23073.6 字节;取舒曼童年情景那份公有领域乐谱的 3 份净和 164328、本页写 160.5 KB,0.16 MB 还原 167772.16,差 +3444.16 字节还跨了档。
Q:大小列那一格能反推回原始字节吗?
只能反推到显示精度那层:15 份还原和 5305548.8、真实和 5305582,净差 -33.2 字节、单份最大 -48。
Q:为什么总大小是 MB、平均大小却是 KB?
两行各进各的 formatSize,档位跟着各自的数值走。同一份 totalSize 5141254,份数从 4 加到 5,平均行就从 1.23 MB 掉到 1004.2 KB,总大小行仍在 MB。
Q:平均大小的两轮取整平时看不出?
平时看不出来:428437.8333333333 到 428438 的位移够不着 toFixed(1) 的换串线,摘掉 Math.round 仍是 418.4 KB;1075.2 与 100.25 这两个构造样本才把两轮分开。
Q:排过序再导出,文件里也是排过的序?
不是。导出走投递序,排过序的只是表格那份副本:实测表格首行 01_SchumannOp15No01-a4.pdf、导出首行 01_einsamkeit-a4.pdf。