为什么1/2、0.5和50%会被判成同一个答案?cn-math-taxonomy判题算法与精确有理数比较详解

发布时间:2026/10/22 2:00:44
为什么1/2、0.5和50%会被判成同一个答案?cn-math-taxonomy判题算法与精确有理数比较详解
【免费下载链接】cn-math-taxonomy中小学知识图谱 前置诊断数学一–九年级、高中必修与选择性必修 英语小学、初中、高中课标对齐、人教版1503 知识点、6159 题、自适应诊断项目地址https://gitcode.com/gh_mirrors/cn/cn-math-taxonomy点击查看免费下载cn-math-taxonomy 是一个面向中小学数学的知识图谱 前置诊断项目覆盖小学一至九年级、高中必修与选择性必修内置 999 个知识点、4143 道题和自适应诊断。当你在它的诊断工具里输入0.5、1/2或50%时判题引擎都会判定为正确——这不是巧合而是一套精确有理数比较算法在起作用。本文将用通俗的方式拆解这套判题算法文本如何被规范化、小数和分数如何被统一成同一个有理数、为什么不用浮点数比较以及哪些情况会交给你自评。如上图在诊断工具中回答2/8 3/8 ?并输入5/8系统自动判定正确同时展示参考答案与解析。这套自动判题正是我们今天要拆解的主角。判题流程总览从输入框到判定的三步判题代码全部集中在 diagnose/engine.js 中是一个无 DOM、无依赖的纯函数模块浏览器和 Node 都能直接调用。一次判题judgeQuestion大致分三步文本规范化normalizeText把各种写法差异抹平数值解析parseNumeric把答案安全地解析成一个精确有理数分子/分母逐部分比较partComparecompareParsed用户答案与参考答案按部分如坐标的每个分量比较能可靠判断的给correct/wrong判断不了的返回manual交给用户自评。下面逐步展开。第一步文本规范化先让写法不再重要学生在输入框里写的东西往往五花八门全角字符、多余空格、中文标点、×和÷、千分位逗号……normalizeText会统一做以下处理全角转半角NFKC 归一化→1/2→-3统一符号×和·→*÷→/²→^2≦/→≤中文标点转英文、→,。→.全角括号 → 半角去空白去掉答前缀和结尾句号千分位1,000→1000带分数1 1/2→1又1/2与1又1/2写法统一。页面答题区也明确提示了这一点自动判题只是近似的数字、分数、多个答案会做规范化后比较一切以参考答案为准判错了可以手动更正。核心机制把一切数值都变成约分后的有理数规范化只是铺垫真正的精髓在数值等价判断。引擎不会把0.5和1/2转成浮点数去比那样会踩精度陷阱而是把每一种数值写法都转成一个唯一的标准形式约分后的 分子/分母用的是 JavaScript 的BigInt全程整数运算、零误差你输入解析过程标准形式1/21 ÷ gcd(1,2)1/20.55/10 → ÷ gcd(5,10)1/22/4÷ gcd(2,4)1/250%50/100 → ÷ gcd(50,100)1/21又1/21 1/2 3/23/21.515/10 → ÷ gcd(15,10)3/2关键函数有两个diagnose/engine.js 中的decToRatio把小数按位值展开成分数0.5就是5/100.333就是333/1000ratio用辗转相除法gcd约分并把符号统一放到分子上。只要标准形式相同就判定等价——所以1/2、0.5、2/4、50%在引擎眼里是同一个数。为什么不用浮点数用parseFloat(0.1) parseFloat(0.2) 0.3做比较几乎注定翻车二进制浮点无法精确表示十进制小数。而精确有理数比较没有任何近似2/4未约分也判对——因为4/8约分后就是1/2反过来1/3和0.333会判错——前者是1/3后者是333/1000约分后依然不等。这正是它比容差比较更严谨的地方不放过真错也不冤枉等价的写法。这些用例全部被写进了测试 tests/test_engine.jsverdict(0.5, 1/2) correct verdict(2/4, 1/2) correct verdict(50%, 1/2) correct verdict(1/3, 0.333) wrong运行node tests/test_engine.js即可复现全部断言。不止数值多答案、单位、变量名也各有规则判题并不只针对单个数几个常见场景的处理方式多答案顺序无关-3 和 -1/2与-1/2-3判对按、 ;及和/或/与拆分坐标(1,2)里的逗号不拆单位别名等价12米12 m25 平方米25 m²两边是不同的已知单位12 cmvs12 m则判错变量名可省略x3与3判对但多答案时x2y3对x3y2判错不能张冠李戴坐标(0.5,2)与(1/2,2)逐项比较判对。判不靠谱时怎么办宁可交给人这是这套算法最值得称道的设计只在可靠时给结论。judgeQuestion按题型分派题型判定方式choice选择题比选项字母也接受选项文字认不出来交自评numeric数值题上述精确有理数比较支持accept等价写法short短答题规范化后精确匹配否则不判错、交自评self开放题一律自评比如你写y12x、参考答案是y2x1数学上等价但引擎无法可靠判断代数式等价就返回manual展示参考答案让你自己看同样y(x-2)²-1与yx²-4x3也会交给人。宁可少判不可错判——界面上也随时可以点判错了我其实没做对手动改判结果页会整体重算。判题只是诊断的一环答错会自动回溯先修判题的结论掌握 / 不稳 / 薄弱会驱动整个诊断流程每个知识点最多问 2 题第一题对即判掌握并跳过所有先修两题都错才判薄弱并沿先修边hard 先、soft 后一路回溯把根因从高中、初中一直追到小学的具体知识点最后给出按年级从低到高排列的学习路径。算法细节、URL 参数target、grade、seed等与局限说明可阅读 diagnose/README.md题库共 3355 题的格式与核验方法见 docs/questions.md 和 data/questions.json。小结cn-math-taxonomy 的判题算法可以浓缩成三句话先规范化——全角、空格、标点、符号统统抹平让写法差异不干扰判断再精确化——整数、小数、分数、百分数、带分数全部转成 BigInt 有理数并约分1/2、0.5、50%殊途同归而1/3和0.333各归各位判不了就放手——代数式、文字、证明题一律交给用户自评自动判题只做可靠的那部分。这套机制让诊断工具既能自动批阅绝大多数数值题又不会为了显得聪明而错判学生的正确答案。注项目数据为 AI 生成的初稿判题结论仅供参考一切以参考答案为准。赞分享【免费下载链接】cn-math-taxonomy中小学知识图谱 前置诊断数学一–九年级、高中必修与选择性必修 英语小学、初中、高中课标对齐、人教版1503 知识点、6159 题、自适应诊断项目地址https://gitcode.com/gh_mirrors/cn/cn-math-taxonomy点击查看免费下载相关推荐PHPStan foreach.emptyArray 错误详解为什么空数组上的 foreach 循环会被判定为死代码PHPStan foreach.emptyArray 错误详解为什么空数组上的 foreach 循环会被判定为死代码 导读 foreach.emptyArra开发工具代码质量静态分析为什么「中文数学知识分类」是个难题从 cn-math-taxonomy 的 226 个 fork 说起为什么「中文数学知识分类」是个难题从 cn math taxonomy 的 226 个 fork 说起 一个仓库在 README 第一行就写着这是 AI 生为什么「中文数学知识分类」是个难题从 cn-math-taxonomy 的 226 个 fork 说起为什么「中文数学知识分类」是个难题从 cn math taxonomy 的 226 个 fork 说起 你有没有想过这样一个问题 从小学一年级的1 到 5上一篇PyInstaller提取器10分钟拆解PyInstaller打包程序源码的实战指南下一篇LibrePhotos 常见故障排查指南Proxmox 扫描崩溃、视频 404 与只读扫描目录的完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考