我在 Python 里用内置的 round 给一批金额做四舍五入本以为这是小学就会的常识级操作不可能出错,结果对账时总额老是差那么几分钱单个数也对不上,我把 round(0.5) 打出来看到的竟是 0 而不是 1 当场就懵了,排查很久才搞懂 Python3 的 round 用的根本不是我以为的四舍五入而是四舍六入五成双的银行家舍入的深度复盘

我做一个涉及金额计算的功能、要把一堆金额四舍五入到整数或两位小数,想都没想就用了 Python 内置 round——这不就是四舍五入嘛。可上线后对账出问题:把一批数各自 round 再求和、总额和财务按四舍五入算的预期值总差那么几分钱平不了;挑几个 .5 结尾的单独试更头皮发麻——round(0.5)=0 不是 1、round(2.5)=2 不是 3、但 round(1.5)=2、round(3.5)=4 又符合直觉、同样是 .5 有的进有的不进;还有 round(2.675,2)=2.67 不是 2.68 连五成双都解释不了。盯着看半天咂摸出:这些 .5 舍入后结果全是偶数!它不是逢五就进而是逢五往最近的偶数靠。查才知这是有意采用的规则——银行家舍入 banker's rounding 正式名四舍六入五成双 round half to even,Python3 内置 round 用的正是它而非传统四舍五入 round half up。区别全在正好 .5 时:四舍五入逢五一律向上进、银行家舍入舍入到离它最近的偶数(0.5→0 1.5→2 2.5→2 3.5→4 结果全偶);非 .5 两者一致(故称四舍六入五成双)。Python/IEEE754 默认用它是因为逢五就进会让大批量舍入系统性偏大、五成双让一半往上一半往下正负抵消统计无偏更严谨、不是 bug。而 round(2.675,2)=2.67 是另一层:2.675 在二进制浮点无法精确表示实际存的是略小于 2.675 的值、round 看到的真实值小于 2.675 自然舍成 2.67、与银行家舍入无关是浮点误差。正解:涉及金额需精确且舍入规则确定的场景别用 float+内置 round、改用 decimal.Decimal(且必须用字符串构造 Decimal('2.675') 而非从 float 构造否则带入误差)、用 quantize 显式指定保留位数和舍入模式(传统四舍五入 ROUND_HALF_UP、银行家舍入 ROUND_HALF_EVEN)、金额运算全程 Decimal 别和 float 混。这篇复盘从故障现场讲到 round 是银行家舍入加浮点误差、两种舍入对照、误区,再到 Decimal+quantize 显式指定规则的完整正解与对账自测清单,以及负数取模/字符串长度/日期加月/浮点相等等同类看似人人都懂实际定义和常识不同的坑,和常识与精确、越基础越笃定的常识级操作在精确场景越要核实其确切定义的认知。

我在 Python 里用内置的 round 给一批金额做四舍五入、本以为这是小学就会的常识级操作不可能出错,结果对账时总额老是差那么几分钱、单个数也对不上,我把 round(0.5) 打出来看到的竟是 0 而不是 1 当场就懵了,排查很久才搞懂 Python3 的 round 用的根本不是我以为的四舍五入而是四舍六入五成双的银行家舍入的深度复盘

这次踩的坑,坑在它击穿了我一个"这还能错?"级别的常识——四舍五入,谁不会啊?可正是这种"我闭着眼都对"的笃定,让我把一个其实定义和我想的不一样的操作,用错了还浑然不觉。

故障现场:对账总差几分钱,round(0.5) 竟然等于 0

我在做一个涉及金额计算的功能,需要把一堆金额四舍五入到整数(或两位小数)。我想都没想就用了 Python 内置的 round()——这不就是四舍五入嘛。可上线后对账就出问题了:

  • 总额对不上:把一批数各自 round 之后再求和,得到的总额和财务那边按"四舍五入"算的预期值,总是差那么几分钱/几块钱,不多,但对账就是平不了。
  • 单个值也不符直觉:我挑了几个 .5 结尾的数单独试,结果让我头皮发麻——round(0.5) 得到的是 0,不是我以为的 1;round(2.5) 得到的是 2,不是 3
  • 但有些 .5 又"对":round(1.5)2round(3.5)4,这些又符合直觉。同样是 .5,有的进有的不进,毫无规律可言(我当时以为)。
  • 还有更邪门的:round(2.675, 2) 我以为会是 2.68,结果是 2.67,连"五成双"都解释不了。

"0.5 进成 0、2.5 进成 2、但 1.5 进成 2、3.5 进成 4"——盯着这组结果看了半天,我突然咂摸出一点门道:这些 .5 的数,舍入后的结果全都是偶数!0.5→0(偶)、1.5→2(偶)、2.5→2(偶)、3.5→4(偶)。它不是"逢五就进",而是"逢五,往最近的偶数那边靠"。这跟我从小学的"四舍五入"完全是两套规则。我得去搞清楚,Python 的 round 到底按的是什么规矩。

第一件事:搞懂 Python3 的 round 用的是"银行家舍入"(四舍六入五成双)

带着这个".5 往偶数靠"的线索去查,我才知道这是个有名有姓的、被有意采用的舍入规则——银行家舍入(banker's rounding),正式名称叫"四舍六入五成双"(round half to even)。Python3 的内置 round(),用的正是它,而不是我以为的"四舍五入"(round half up)。

这两套规则的区别,全在"正好是 .5(恰好在两个整数中间)"这一种情况怎么处理:

  • 四舍五入(round half up,我以为的):遇到 .5 一律向上进位。0.5→1,1.5→2,2.5→3,3.5→4。
  • 银行家舍入(round half to even,Python 实际用的):遇到 .5 时,舍入到离它最近的偶数。0.5→0(0 是偶数),1.5→2(2 是偶数),2.5→2(2 是偶数),3.5→4(4 是偶数)。

而非 .5 的情况(比如 0.4、0.6),两套规则完全一致——所以它才叫"四舍六入五成双":小于五照舍(四舍)、大于五照进(六入)、正好是五时往偶数凑(五成双)。

为什么 Python(以及 IEEE 754 浮点标准)默认用这个看起来"古怪"的规则?因为它能减少大批量舍入时的累计偏差"逢五就进"会让所有 .5 都系统性地往大走,大量数据累加起来,总和会偏大;而"五成双"让 .5 一半往上(凑偶)、一半往下(凑偶),正负偏差大致抵消,统计上更无偏。这在金融、科学计算里是更严谨的选择——所以它不是 bug,是刻意设计

至于 round(2.675, 2) 为什么是 2.67 而不是 2.68,那是另一层原因叠加上来:浮点数 2.675 在二进制里根本无法被精确表示,它实际存储的值是个略小于 2.675 的数(类似 2.67499999...),于是 round 看到的"真实值"小于 2.675,自然就舍成了 2.67。这跟银行家舍入无关,是浮点表示误差在作祟。我把这些行为一次性验证清楚:

>>> round(0.5)   # 0 是偶数 -> 0(不是 1!)
0
>>> round(1.5)   # 2 是偶数 -> 2
2
>>> round(2.5)   # 2 是偶数 -> 2(不是 3!)
2
>>> round(3.5)   # 4 是偶数 -> 4
4
>>> round(2.675, 2)   # 2.675 浮点存的是 2.67499... -> 2.67(不是 2.68!)
2.67
>>> [round(x) for x in (0.5, 1.5, 2.5, 3.5)]   # 全都舍到了偶数
[0, 2, 2, 4]

真相大白:不是 round 有 bug,也不是结果"没规律",而是我把"四舍五入"这个看似人人都懂的常识,想当然地套在了一个实际定义并不相同(用的是银行家舍入)、而且底层还受浮点表示影响round 上。我从没去查过 Python 的 round 到底按什么规则舍入,默认它就是我小学学的那一套——结果在涉及金额、需要精确的场景里,这个偷懒的"常识"就让对账平不了了。

第二件事:正解——金额精确计算用 Decimal,明确指定你要的舍入规则

根因是"round 是银行家舍入 + float 有表示误差",那正解的核心就一句话:涉及金额、需要精确和确定舍入规则的场景,别用 float + 内置 round,改用 decimal.Decimal,并显式指定你要的舍入模式。

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN

# 1) 金额一律用 Decimal, 且用字符串构造(别从 float, 否则把浮点误差也带进来)
price = Decimal("2.675")          # 正确:精确表示 2.675
# price = Decimal(2.675)          # 错误:2.675 已是有误差的 float

# 2) 用 quantize 指定保留几位 + 显式指定舍入规则
# 要传统"四舍五入"(逢五进一):ROUND_HALF_UP
price.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)   # -> 2.68

# 要银行家舍入(逢五成双):ROUND_HALF_EVEN
Decimal("2.5").quantize(Decimal("1"), rounding=ROUND_HALF_EVEN)  # -> 2
Decimal("2.5").quantize(Decimal("1"), rounding=ROUND_HALF_UP)    # -> 3

# 3) 金额运算全程用 Decimal, 别和 float 混
total = Decimal("0.10") + Decimal("0.20")    # -> Decimal('0.30') 精确
# 0.1 + 0.2 (float) -> 0.30000000000000004 不精确

这套做法有几个关键点:第一,用 Decimal 而不是 float——Decimal 按十进制精确存储,不会有 0.1+0.2≠0.3 那种二进制表示误差。第二,Decimal 要用字符串构造(Decimal("2.675")),如果从 float 构造(Decimal(2.675))就把 float 的误差一起带进来了,前功尽弃。第三,用 quantize显式传 rounding 参数——你要"逢五进一"就传 ROUND_HALF_UP,要"逢五成双"就传 ROUND_HALF_EVEN,把舍入规则明明白白写出来,而不是依赖某个默认值。核心就一条:精确计算(尤其是钱)别碰 float 和默认 round,用 Decimal 把"用什么舍入规则"显式声明清楚。

如果只是非金额、不要求那么精确的展示,内置 round 也不是不能用,但你必须知道它是银行家舍入、并接受它;需要传统四舍五入又不想上 Decimal,也可以自己用 math.floor(x + 0.5) 之类实现,但要小心浮点误差。关键不是用哪个,而是清楚你用的那个到底按什么规则舍入。

第三件事:同一类"看似人人都懂的通用操作、实际定义和常识不同"的坑,我后来又撞见好几个

这次踩坑让我警惕起一类特别隐蔽的坑:有些操作"看起来太基础、太通用",基础到我们觉得"这还用查?闭着眼都对",于是凭常识就用了;可它的精确定义、边界行为,其实和我们的常识不完全一样,而恰恰因为我们太笃定,从不去查,就栽了。这种坑到处都是:

  • 整数除法 / 取模对负数:-7 % 3 在 Python 里是 2(结果随除数符号),和 C/Java 的 -1 不同;// 是向下取整除,-7 // 2 = -4 不是 -3。
  • 排序的稳定性/比较规则:有的语言排序默认按字符串比较数字(JS),有的不稳定;不查就以为"排序不就那样"。
  • 字符串大小写/长度:len 对含 emoji、组合字符的字符串,算的是码元/码点而非"看起来几个字";大小写转换在不同语言区(土耳其 i)有坑。
  • 日期"加一个月":1月31日加一个月是几号?各库定义不同,没有"显然正确"的答案。
  • 浮点相等比较:0.1 + 0.2 == 0.3False,这个"加法"常识在浮点世界不成立。

它们的内核是同一个:越是"基础、通用、人人都会"的操作,我们越容易不假思索地用常识去套,而越不会去查它的精确规范;可这些操作的实现,往往出于严谨性、历史、底层表示等原因,在边界情况(.5、负数、特殊字符、精度极限)上的行为,和我们朴素的常识存在微妙但确凿的差异这种差异在粗放场景下无伤大雅,可一旦进入需要精确、需要正确的场景(钱、计数、对账、安全),它就会变成实打实的 bug。所以,凡是结果必须精确正确的地方,即使是再"基础"的操作,也别凭常识,去查清楚它的确切定义、用满足你需求的专门工具。我把这套判断画成了一张图(见后文)。

"常识级"操作 实际与常识不同之处 精确场景该用
round() 四舍五入 是银行家舍入(五成双)+ 浮点误差 Decimal + quantize 指定规则
金额用 float 算 0.1+0.2≠0.3 二进制表示误差 Decimal 全程精确
负数取模 % 结果符号各语言不同 查清语言规范再用
len(字符串) 算码点不是"看起来几个字" 按需用 grapheme 处理
日期加一个月 月末加月无统一定义 用明确语义的日期库

第四件事:四舍五入 vs 银行家舍入——一张对照表

这次事故逼我把两种舍入在 .5 处的差别摆成一张表,以后做舍入前先确认自己要哪种:

原值 四舍五入 round half up(常识) 银行家舍入 round half even(Python round)
0.5 1 0(0 是偶数)
1.5 2 2(2 是偶数)
2.5 3 2(2 是偶数)
3.5 4 4(4 是偶数)
0.4 / 0.6(非 .5) 0 / 1 0 / 1(两者一致)
大批量求和偏差 系统性偏大 正负抵消、更无偏

看清这张表,选择就清楚了:差别只在"正好 .5"这一种情况——常识的四舍五入逢五一律进、银行家舍入逢五凑偶;Python 内置 round 用的是后者。要哪种取决于业务(财务报表常要传统四舍五入,科学统计常用银行家舍入),但无论要哪种,都得显式指定,而不是默认"round 就是我想的那个"。

第五件事:我曾经对 round 和数值计算想当然的几个误区

这场"对账差几分"的事故,把我对 round 和数值的一堆想当然照得清清楚楚:

我以为 实际上
round 就是四舍五入逢五进一 Python3 是银行家舍入、逢五成双
round(0.5) 当然是 1 是 0(0 是离 0.5 最近的偶数)
round(2.675,2) 必是 2.68 是 2.67、2.675 浮点存的是 2.6749...
这么基础的操作不可能有坑 越基础越凭常识用、越不查规范越栽
金额用 float 算算无所谓 0.1+0.2≠0.3、必须用 Decimal
round 结果没规律是它的 bug 是有意设计的无偏舍入、不是 bug

这些误区的根子是同一个:我把"四舍五入"这个小学就建立、用了一辈子从没出过错的常识,当成了一个放之四海皆准、任何 round 函数都必然如此的真理,笃定到从未想过要去查 Python 的 round 究竟按什么规则正因为这个常识太"显然"、太"不可能错",它反而成了我唯一没设防的地方——我会去查陌生 API 的文档,却不会去查"四舍五入"这种"我闭着眼都会"的操作。对一个看似最基础、最不可能出错的常识级操作过度自信、从不核实其在当前工具中的精确定义,是这类"常识陷阱"的共同根源。

第六件事:做舍入/数值计算、对账对不上时,我现在的自检习惯

现在每当我要做舍入、或排查"金额/统计对不上",我都会先把"这个操作的确切规则是什么"问清楚。先看清遇到舍入该怎么决策:

然后用这张自检图判断任何"常识级操作"该不该先查规范:

配套地,我把"金额用 Decimal、显式舍入"封装成了项目里统一的金额处理工具,杜绝有人再随手 round:

from decimal import Decimal, ROUND_HALF_UP

# 项目统一的金额舍入: 入参可为 str/int/Decimal(别传 float), 显式四舍五入到分
def money_round(value, places="0.01") -> Decimal:
    d = value if isinstance(value, Decimal) else Decimal(str(value))
    return d.quantize(Decimal(places), rounding=ROUND_HALF_UP)

# 用法:全链路 Decimal, 舍入规则写死在一处, 不再各处 round
assert money_round("2.675") == Decimal("2.68")   # 传统四舍五入
assert money_round("2.5", "1") == Decimal("3")

而排查一个"对账差几分"时,我固定先把可疑值的舍入行为单独打出来对比:

# 排查: 把内置 round 和"传统四舍五入"的结果并排打出来, 一眼看出差在哪
from decimal import Decimal, ROUND_HALF_UP
for x in ["0.5", "1.5", "2.5", "2.675"]:
    builtin = round(float(x), 0 if "." not in x[2:] else 2)
    half_up = Decimal(x).quantize(Decimal("1") if x.endswith(".5") else Decimal("0.01"),
                                  rounding=ROUND_HALF_UP)
    print(f"{x}: round()={builtin}  HALF_UP={half_up}")
# 差异集中在 .5 处 -> 实锤是银行家舍入 vs 四舍五入的差别

这套习惯的精髓,是"舍入前先问要不要精确、要精确就用 Decimal 显式指定规则、用 round 也得知道它是银行家舍入、对账对不上先单独打舍入行为对比"它让我从"四舍五入嘛随手 round",变成了"先确认这个 round 到底按什么规则、精确场景用 Decimal 把规则写明"——核心始终是:Python3 的内置 round 函数采用的是银行家舍入 banker's rounding(正式名 round half to even 四舍六入五成双)而不是大多数人从小学的传统四舍五入 round half up——区别只在被舍入的位正好是 5(恰好在两个值中间)这一种情况:传统四舍五入遇五一律向上进位、而银行家舍入遇五时舍入到离它最近的偶数(所以 round(0.5)=0 round(1.5)=2 round(2.5)=2 round(3.5)=4 结果全是偶数),非五的情况两者一致;Python 和 IEEE 754 默认用银行家舍入是有意设计不是 bug、因为逢五就进会让大批量数据的舍入产生系统性偏大的累计偏差而五成双让一半往上一半往下正负抵消统计上更无偏更严谨;此外还要叠加浮点表示误差——像 2.675 这样的十进制小数在二进制浮点里无法精确表示实际存的是略小于 2.675 的值所以 round(2.675,2) 得到 2.67 而非 2.68;所以涉及金额对账计数等需要精确且舍入规则确定的场景绝不能用 float 加内置 round、而要用 decimal.Decimal 做十进制精确运算(且 Decimal 必须用字符串构造如 Decimal('2.675') 而非从 float 构造否则把浮点误差也带进来)、并用 quantize 方法显式指定保留位数和舍入模式(要传统四舍五入用 ROUND_HALF_UP 要银行家舍入用 ROUND_HALF_EVEN)把用哪种舍入规则明明白白写出来而不是依赖默认;更一般地,越是看似基础通用人人都会的操作(四舍五入、整数除法取模对负数、字符串长度与大小写、日期加减、浮点相等比较)我们越容易不假思索地凭常识去套用而越不会去查它的精确规范,可这些操作出于严谨性历史或底层表示等原因在边界情况上的实际行为常常和我们朴素的常识存在微妙但确凿的差异,在粗放场景无伤大雅但一旦进入需要精确正确的场景就会变成实打实的 bug,所以凡是结果必须精确正确的地方即使是再基础的操作也别凭常识自信而要去查清它在当前语言或库里的确切定义和边界行为并选用满足你需求的专门工具。

我立下的几条规矩

这场"对账差几分"的事故,换来了我做数值计算时,刻进骨子里的几条铁律:

  1. Python3 的 round 是银行家舍入(五成双),不是逢五进一。
  2. round(0.5)=0、round(2.5)=2,结果往最近的偶数靠。
  3. 金额一律用 Decimal,绝不用 float 算钱。
  4. Decimal 用字符串构造,别从 float 构造带入误差。
  5. 用 quantize 显式指定舍入规则(HALF_UP / HALF_EVEN)。
  6. 越基础越通用的操作,精确场景越要查清它的确切定义。
  7. 对账对不上,先单独打舍入行为对比,别赖偶发。

附:一段可直接照抄的金额舍入与对账自测清单

最后留一段我自己处理金额舍入、自测对账时照着用的代码清单:

from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN, getcontext

# === 1. 金额一律 Decimal + 字符串构造, 杜绝 float 误差 ===
a = Decimal("0.1") + Decimal("0.2")        # Decimal('0.3') 精确
assert a == Decimal("0.3")                 # float 下 0.1+0.2 != 0.3

# === 2. 舍入显式指定规则, 别用裸 round ===
def round_half_up(x, places="0.01"):       # 传统四舍五入
    return Decimal(str(x)).quantize(Decimal(places), rounding=ROUND_HALF_UP)

assert round_half_up("2.675") == Decimal("2.68")   # 内置 round(2.675,2)=2.67!
assert round_half_up("2.5", "1") == Decimal("3")   # 内置 round(2.5)=2!

# === 3. 对账自测: 先各自舍入再求和, 和先求和再舍入可能不同, 明确口径 ===
items = ["1.005", "2.005", "3.005"]
each_then_sum = sum(round_half_up(x) for x in items)        # 每笔先舍入
sum_then_round = round_half_up(sum(Decimal(x) for x in items))  # 总额再舍入
print("逐笔舍入再求和:", each_then_sum)
print("求和再舍入:", sum_then_round)   # 两者可能差几分 -> 和财务对齐口径!

# === 4. 设置全局精度上下文(大量运算时) ===
getcontext().rounding = ROUND_HALF_UP   # 让上下文默认就用四舍五入

这段清单的核心就一句:金额全程 Decimal(字符串构造)、舍入显式指定 ROUND_HALF_UP/EVEN、对账先和财务对齐"逐笔舍入还是总额舍入"的口径。把"随手 round 算钱"换成"Decimal 显式舍入",那几分钱平不了的账,就再也不会找上门了。

写在最后

回头看,这场由"round 是银行家舍入"引发的"对账差几分"事故,真正教给我的,远不止"金额用 Decimal、显式指定舍入"这一个技巧。它让我对"最危险的错误,往往不藏在我们不懂的地方,而藏在我们自以为最懂、笃定到从不怀疑的地方",有了一次刻骨的体会。我栽跟头,是因为我把"四舍五入"当成了一个小学就刻进骨子、用了一辈子从没错过、根本不需要查的常识——正因为它太"显然"、太"不可能错",它成了我整个知识体系里唯一没设防的地带:我会一丝不苟地去查一个陌生 API 的每个参数,却从没想过要去查"round 到底怎么舍入",因为在我心里这压根不是个问题;可恰恰是这个我从不设防的常识,在它的精确定义(银行家舍入)和我朴素的认知(逢五进一)悄悄分了岔的地方,给了我一记闷棍。这让我领悟到一个关于"常识与精确"的深刻认知:我们脑子里的"常识",大多是在粗放、近似、够用就好的日常场景里习得和验证的,它们是对世界的有用简化;可这些简化都带着没说出口的适用范围——"四舍五入逢五进一"在小学算术里对,但在需要无偏统计、需要十进制精确的工程场景里,它就只是众多舍入规则中的一种、而且不是默认那种;常识的可怕之处在于,它太顺手、太自动,以至于在该较真的时候,我们意识不到自己正在用一个未经核实的简化——我们不是判断错了,而是根本没意识到这里有个需要判断的点;所以,真正的严谨,不是去查那些你知道自己不懂的东西(那是本能),而是有意识地去盘问那些你"觉得自己当然懂"的常识——尤其当场景要求精确、正确时,对每一个"这还用查?"的念头,都该多问一句"它在这里的确切定义,真的和我以为的一样吗?"这给了我一种面对"一切自己笃定到不愿核实的常识"时的警觉:每当我在一个需要精确的场景里,要用一个"基础到我从没想过要查"的操作时,我都强迫自己停一下"我对它的笃定,是来自我查证过它在这里的确切行为,还是仅仅来自一个从未在精确场景里被检验过的旧常识"——对常识级操作在精确场景里保持一分怀疑、去核实它的确切定义;"越笃定越要在精确场景里核实、别让旧常识在新精度要求下蒙混过关",是用对 round、也是做对一切精确计算的关键认清 round 是银行家舍入、金额要用 Decimal、舍入规则要显式指定——这,是我用一次"对账总差那么几分钱"的事故,换来的、关于 Python、也关于如何不被自己的常识绊倒的、最朴素也最深刻的领悟。如果这篇复盘,能让你下次写下 round( 之前、或者用 float 算钱之前,心里咯噔一下"等等,这个 round 是银行家舍入啊,算钱该用 Decimal",那我对着那几分钱怎么都平不了的账熬的那个晚上,就值了。

—— 别看了 · 2026
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。
技术教程

我给 AI Agent 一个稍微复杂点的任务让它自己拆成几步去做、它确实拆得有模有样,可执行起来却经常翻车——后面那步明明要用到前面那步产出的结果它却抢在前面没跑完就先干了拿着一个空值或占位符往下走最后整条链全错,排查很久才搞懂它把本来有先后依赖的几步当成了互不相干谁先谁后都行的一张平铺清单的深度复盘

2026-6-3 16:54:21

技术教程

我在 JavaScript 里随手用一个普通对象当字典来存用户提交的键值数据还用 key in obj 判断某个键存在不存在,结果有用户根本没提交过 toString 这个键我的代码却判定它存在并走错了分支,更有个用户把键填成 __proto__ 直接让一批对象行为错乱,排查很久才搞懂用字面量对象当字典时它身上本就继承着一堆原型链上的属性的深度复盘

2026-6-3 17:06:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索