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

关于Math.pow(3,35)计算结果与预期不符的技术咨询

问题解析:Math.pow(3,35)的精度偏差

这不是JavaScript的Bug,而是IEEE 754双精度浮点数的固有精度限制导致的,很多使用该标准的计算器、编程语言都会出现同样现象。

核心原因

JavaScript中所有数字都遵循IEEE 754双精度标准,该标准用64位存储数字:

  • 1位符号位,11位指数位,52位尾数位(加上隐含的1位,总共53位二进制有效精度)。

对于整数来说:

  • 当数值小于2^53(即9007199254740992)时,所有整数都能被精确表示;
  • 当数值大于等于2^53时,只有满足整数 = m * 2^k(其中m是小于2^53的整数)的数才能被精确存储,其他整数会被舍入到最近的可表示浮点数。

具体到你的案例

  1. **335的精确值**:`50031545098999704`,这个数的二进制长度超过了53位,且无法表示为`m*2^k`(m<253)的形式,因此无法被双精度浮点数精确存储。
  2. Math.pow(3,35)的计算逻辑:该方法通过exp(b * ln(a))的方式计算幂,而ln(3)是无理数,计算过程中会产生近似值,最终结果会被舍入到最近的可表示浮点数,也就是你看到的50031545098999710。
  3. *Math.pow(3,34)3能得到正确结果的原因:3^34的精确值是16677181699666568,这个数刚好可以被双精度浮点数精确表示(符合m*2^k的形式)。用这个精确值乘以3后,得到的50031545098999704同样符合精确存储的条件,因此结果正确。

验证代码

console.log(Math.pow(3,35)); // 输出 50031545098999710
console.log(Math.pow(3,34)); // 输出 16677181699666568(精确值)
console.log(Math.pow(3,34)*3); // 输出 50031545098999704(精确值)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:08:10