You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在JavaScript中40000000000000000 - 3结果仍为40000000000000000?

为什么JavaScript中40000000000000000 - 3的结果还是40000000000000000?

这是个非常典型的JavaScript浮点数精度陷阱,根源在于JS里的Number类型遵循IEEE 754双精度64位浮点数标准,这个标准的存储机制决定了它无法精确表示所有整数。

核心原因:双精度浮点数的精度上限

IEEE 754双精度浮点数用64位存储,拆分来看:

  • 1位符号位(标记正/负)
  • 11位指数位(控制数值的量级)
  • 52位尾数位(存储数值的有效精度,额外隐含1位,总共53位有效精度)

这意味着,所有绝对值≤2^53(即9007199254740992)的整数都能被精确表示,但超过这个阈值后,相邻两个可精确表示的整数之间的间隔会大于1。

咱们来拆解40000000000000000这个数:
它的数值是4×1016,远大于253。此时这个量级对应的浮点数间隔是2(55-52)=8(指数位对应的指数为55,间隔计算公式为2(指数-52))。也就是说,在这个范围内,只有能被8整除的整数才能被精确存储。

  • 40000000000000000 ÷ 8 = 5×10^15,是整数,所以它能被精确表示。
  • 而40000000000000000 - 3 = 39999999999999997,这个数除以8等于4999999999999999.625,不是整数,无法被精确存储。JS会自动把它舍入到最近的可表示浮点数——也就是40000000000000000(因为它和目标值的差是3,比和前一个可表示数39999999999999992的差5更近)。

解决办法:使用BigInt类型

如果需要对超大整数进行精确计算,JavaScript提供了BigInt类型,只要在数字末尾加上n,就能支持任意精度的整数运算:

40000000000000000n - 3n; // 结果是 39999999999999997n

内容的提问来源于stack exchange,提问作者pizzarob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:43:28