> **发布元数据**：Qoder · Kimi K3（评测者确认）· R01
> **来源**：`qoder/输出/qoder/T03/R01/BENCHMARK_RESULT.md`
> **原始文件 SHA-256**：`07dacb79cd4284d79fe340ba62b0533a8d0c3fefc4261d485d2243eb25396c6f`
> 本公开副本已将评测机绝对路径归一化；下文 PASS/FAIL/BLOCKED 是执行报告自述状态，不等同于独立验收结论。

---

# BENCH-RUN T03 R01

# T03：金额精度修复 — 结果：PASS

## 题面（逐字）

> # T03：金额精度修复
>
> 修复 `ledger.money.parse_money(value)`，保持函数名、参数和正常调用方式兼容。
>
> 要求：
> 1. 返回整数分；整数 `12` 和字符串 `"12"` 都表示 12 个主要货币单位并返回 `1200`；`"12.3"` 返回 `1230`，`"-0.01"` 返回 `-1`。
> 2. 只接受整数（不含布尔值）或符合 `^-?\d+(\.\d{1,2})?$` 的字符串。
> 3. 浮点数、布尔值、空字符串、首尾空白、非数字、前导加号及超过两位小数均抛出 `ValueError`；不能静默截断或四舍五入。
> 4. 不改变与金额解析无关的公开行为，不增加运行时依赖；可新增测试，不得删改已有测试。
>
> 运行 `python3 -m unittest discover -s tests -v`，并报告实际命令和结果。

## 实际改动

1. **`ledger/money.py`（重写 `parse_money`）**：
   - 布尔值先行拒绝（`isinstance(value, bool)` 先于 `int` 判断，因为 `bool` 是 `int` 子类），抛 `ValueError`。
   - 整数：`value * 100`，精确无浮点。
   - 字符串：用 `re.compile(r"(-?)(\d+)(?:\.(\d{1,2}))?", re.ASCII)` 做 `fullmatch` 严格匹配（`fullmatch` 排除尾部换行等 `$` 锚点漏洞；`re.ASCII` 使 `\d` 只认 ASCII 数字，拒绝全角数字）；不匹配即 `ValueError`。
   - 匹配后手工合成整数分：`int(whole) * 100 + int(fraction.ljust(2, "0"))`，再按符号取负 —— 全程整数运算，无截断/四舍五入。`"12.3"` → `1200 + 30 = 1230`；`"-0.01"` → `-(0 + 1) = -1`。
   - 其他类型（浮点、None、列表等）一律 `ValueError`。
   - 函数名、参数、返回类型不变；未增运行时依赖（`re` 为标准库）。
2. **`tests/test_money_strict.py`（新增）**：10 个断言组覆盖题面全部要求：整数/字符串等价、小数补位、负数、拒绝类型（bool/float/None/容器）、拒绝字符串（空串、首尾空白、尾部换行、非数字、前导 `+`、超两位小数、`12.`、`.5`、重复负号、千分位、十六进制、全角数字）、不静默截断（`"1.999"`）。
3. 未删改任何已有测试与生产代码公开行为。

## 实际运行的命令与结果

```text
$ python3 -m unittest discover -s tests -v
test_default_fixture_loads (test_baseline.BaselineSmokeTests) ... ok
test_default_summary_shape (test_baseline.BaselineSmokeTests) ... ok
test_list_command_runs (test_baseline.BaselineSmokeTests) ... ok
test_valid_money_inputs (test_baseline.BaselineSmokeTests) ... ok
test_fraction_padding (test_money_strict.ParseMoneyStrictTests) ... ok
test_int_and_str_equivalence (test_money_strict.ParseMoneyStrictTests) ... ok
test_negative_values (test_money_strict.ParseMoneyStrictTests) ... ok
test_no_silent_truncation (test_money_strict.ParseMoneyStrictTests) ... ok
test_rejected_strings (test_money_strict.ParseMoneyStrictTests) ... ok
test_rejected_types (test_money_strict.ParseMoneyStrictTests) ... ok
----------------------------------------------------------------------
Ran 10 tests in 0.001s
OK
```

另做 CLI 冒烟与题面样例直验：

```text
$ python3 -m ledger summary
Transactions: 6
Total: $117.56
$ python3 -c 断言 parse_money(12)==1200, parse_money("12")==1200, parse_money("12.3")==1230, parse_money("-0.01")==-1
spec cases OK
```

`git status --porcelain`：`M ledger/money.py`、`?? tests/test_money_strict.py`（仅这两处改动）。

## 耗时

UNKNOWN（未使用计时工具精确测量；本题在数分钟内完成）。

## 未完成项

无。

## 会话隔离状态

本题使用独立 workspace（`输出/qoder/T03/R01/workspace/`），所有改动仅发生在该目录；未触碰基准仓库、题面或其他题目目录。
