在线积分板

把多人比赛的每行「姓名 分数」粘贴进来,实时排出名次、算出总分、最高分、平均分,以及每人占总分和占最高分的比例。这是一个纯前端的在线计分板,数据不离开浏览器。

提示:支持并列分数与负分(如惩罚扣分);Ctrl / Cmd + Enter 直接计算,也可用下方按钮。

名次姓名分数占总分占最高分

使用方法

在线积分板的使用只有三步。第一步,在上方文本框里每行写一名选手,姓名和分数之间用空格或制表符隔开,例如「阿强 98」。第二步,按 Ctrl 或 Cmd 加 Enter,或点「计算排名」按钮,页面会立刻按分数从高到低排出名次。第三步,需要留存时点「导出 CSV」拿到带 BOM 的表格,点「导出 JSON」拿到结构化数据,或点「复制对照表」把制表符分隔的内容贴到 Excel。打开页面时文本框里已经放好一份 14 人的示例榜单,直接改名字和分数就能用,不必先想格式。

能解决什么

课堂小测、部门 KPI、棋牌赛、运动会、直播打榜都绕不开同一件事:一堆分数进来,人却很难立刻说出谁第一、谁和第几并列、每个人占了全场的多少。在线积分板把这件手工活自动化——它不只排序,还同时给出总分、最高分、平均分三个汇总,以及每个人的两项占比,让你一眼看清差距的分布,而不只是知道一个名次。当两个人同分时,它会按「奥林匹克排名」给相同名次并跳过后续序号,避免你拿计算器去核对。对于需要留痕的场合,CSV 与 JSON 两种导出让你直接进报表系统,不必重新敲一遍。

原理和变量

这一节回答技术内核的六个问题,只针对在线积分板本身。

① 调用什么算法:排序用 Array.prototype.sort 配合降序比较函数;名次用「竞争排名(Standard competition ranking)」的循环算法——遍历已排序数组,凡分数相等的连续若干行共用同一个名次,该名次等于它们在排序后第一次出现的位置序号,下一组名次直接取当前下标加一。这与稠密排名(dense,并列后不跳号)和分数排名(fractional,并列取平均分位)都不同。

② 参数为什么取这个值:占比同时给出「占总分」和「占最高分」两列,因为总分口径会受低分拖累、最高分口径更直观反映领先幅度,二者互补;平均分用 toFixed(2) 保留两位小数,是因为分数多为整数,两位小数足够表达小数赛制又不会露出处女座级别的抖动。

③ 遵循什么标准:名次规则采用维基定义的「Standard competition ranking」(又称 1224 排名),是体育计分最通用的口径;导出 CSV 带 UTF-8 BOM 遵循 Excel 打开中文表格不乱码的事实约定。

④ 输入怎么变成输出:每行先 trim 去空白,再 split(/\s+/) 按空白切分,末段 Number 转数字、其余拼回姓名;分数经 isFinite 校验后进入数组,按降序排序,随后跑名次循环得到 rank,最后 score / total * 100 与 score / max * 100 算出两列百分比。

⑤ 边界与阈值:选手数量限制在 1 到 100 名;单局分数允许 -99999 到 99999(负分用于扣分惩罚);当所有分数都为 0 时总分为 0,占比分母做保护直接显示 0.00% 而不是 NaN;分数内部走 IEEE 754 双精度,安全整数上限为 2 的 53 次方(9007199254740991),远超日常计分范围。

⑥ 常见误用:误以为并列后名次连续(实际按 1224 会跳号,例如两个第二之后直接是第四);误以为占比该用最高分做分母(那样冠军恒为 100%、掩盖了绝对差距);同分时没有稳定次序,本工具以「输入顺序」作为二次排序键,保证刷新结果一致。

完整示例

下面这份 14 人榜单就是页面打开时文本框里的示例,已按上述规则复算。总分为 740,最高分 98,平均分 52.86。注意小美与老王同为 87 并列第二,阿杰与丽丽同为 76 并列第四,因此榜单里没有第三、第五名,这就是 1224 排名的典型跳号。

名次姓名分数占总分占最高分
1阿强9813.24%100.00%
2小美8711.76%88.78%
2老王8711.76%88.78%
4阿杰7610.27%77.55%
4丽丽7610.27%77.55%
6大锤658.78%66.33%
7阿福547.30%55.10%
7婷婷547.30%55.10%
9小明435.81%43.88%
10阿龙324.32%32.65%
10静静324.32%32.65%
12阿伟212.84%21.43%
13小燕101.35%10.20%
14阿牛50.68%5.10%

输入范围与对照表

在线积分板对输入的约束决定了它能接什么数据。下表把每个字段的允许范围、默认值与非法时的处理列清楚,方便你在上游系统里做校验。分数下限 -99999、上限 99999 覆盖了绝大多数计分场景;若你传入超出该范围的数值,工具会提示具体是哪一行越界,而不是静默归零。

项目允许范围默认 / 示例越界处理
选手数量1 ~ 100 名示例 14 名超过 100 提示删减
单行分数-99999 ~ 9999987超限提示具体行
姓名非空文本阿强缺姓名则报错行号
分隔符空格 / 制表符一个空格多个空白自动合并
总分由分数求和740全 0 时占比显示 0
最高分数组最大值98单人时也正常
平均分总分 / 人数52.86保留两位小數
占比小数位固定 2 位13.24%四舍五入
名次口径1224 竞争排名并列跳号同分稳定次序
负分允许(扣分)-20照常参与排序
小数分数允许9.5照常参与排序
空行自动忽略—不计入人数
安全整数≤ 2^53远低于日常不会触及

上表超过 12 行,点「加载更多」可展开剩余行;需要外发时直接用工具区的 CSV / JSON / 复制对照表。

边界与精度

计分最怕两种边界:全为零和只有一人。当 14 个人的分数全是 0 时,总分为 0,占比公式的分母就是 0,若不做保护会得到 NaN 或 Infinity;在线积分板在这里把占比强制显示为 0.00%,并在汇总区照常给出「总分 0、最高分 0、平均分 0.00」,让你知道数据是空场而不是算错。当只有一名选手时,他自然排第 1,占总分 100%、占最高分 100%,平均分等于他自己的分数。小数分数如 9.5 也照常参与排序与占比,只是平均分可能落到两位小数的中间值。

精度方面,所有运算基于 JavaScript 的 IEEE 754 双精度浮点。整数在 2 的 53 次方以内可精确表示,而计分板的实际数值(百人、十万分以内)远低于这条红线,因此名次与占比不会出现浮点误差导致的错位。百分比保留两位小数用四舍五入,与常见的财务展示一致。

常见问题

名次出现并列时怎么算,为什么有时跳号?

本工具用「竞争排名(1224)」:分数相同的所有人拿同一个名次,下一个名次直接取它们在排序里的位置序号。两个 87 分并列第二后,76 分那组就成第四,所以榜单没有第三名。这是奥运计分的通用口径,不是 bug。

占比到底用总分还是用最高分做分母?

两列都给。占总分反映一个人对全场的贡献,受低分拖累;占最高分更直观地显示他离冠军差多少。看排名分布用总分列,看领先幅度用最高分列,二者互补。

分数可以是负数吗?

可以。负分用于惩罚扣分等场景,例如「阿龙 -20」会照常参与排序与占比计算,只是拉低总分。但单局分数限制在 -99999 到 99999 之间。

最多能排多少名选手?

最多 100 名。超过 100 时工具会提示你删减后再算,避免一次性粘贴几千行把浏览器卡住。日常课堂与赛事远用不到上限。

同分的人谁排前面?

分数相等时,以你在文本框里的输入顺序作为二次排序键,先写的排前面。这样刷新页面结果一致,不会每次乱跳。

平均分为什么要保留两位小数?

分数多为整数,两位小数足以表达小数赛制(如体操 9.5)的差距,又不会暴露无意义的浮点小数。需要更高精度时可在导出 JSON 里看到原始数值。

导出 CSV 为什么要带 BOM?

Excel 打开不带 BOM 的 UTF-8 文件会把中文当成乱码。工具在 CSV 开头写入 UTF-8 BOM(EF BB BF),保证双击就能正常显示中文。JSON 导出则刻意不带 BOM,否则 JSON.parse 会报错。

刷新或关掉页面数据会丢吗?

会。在线积分板是纯前端工具,结果只存在于当前页面,不存储、不上传。重要的榜单请记得导出 CSV 或 JSON 留存。

相关工具

房贷计算器 密码生成器 字数统计工具 颜色选择器 梗图生成器 JSON 格式化工具 真心话大冒险生成器