【问题标题】:Math.pow gives wrong resultMath.pow 给出错误的结果
【发布时间】:2018-08-01 00:44:44
【问题描述】:

我试图重复一个字符 N 次,结果遇到了Math.pow 函数。

但是当我在控制台中使用它时,结果对我来说没有任何意义:

Math.pow(10,15) - 1 提供正确的结果 999999999999999

但是为什么Math.pow(10,16) - 1 提供10000000000000000

【问题讨论】:

    标签: javascript pow


    【解决方案1】:

    您生成的结果超过了Number.MAX_SAFE_INTEGER 值,因此它们不再准确到单位。

    这与 JavaScript 使用 64 位浮点表示数字这一事实有关,因此实际上您只有大约 16 位(十进制)精度。

    由于在 EcmaScript 中引入了BigInt,您可以使用该数据类型获得准确的结果,尽管它不能与Math.pow 结合使用。相反,您可以使用 ** 运算符。

    看看 number 和 bigint(带有n 后缀)的使用有何不同:

    10  ** 16  - 1  // == 10000000000000000
    10n ** 16n - 1n // ==  9999999999999999n
    

    【讨论】:

    【解决方案2】:

    与许多其他编程语言不同,JavaScript 没有定义不同类型的数字,如整数、短整数、长整数、浮点数等。

    JavaScript 数字始终按照国际 IEEE 754 标准存储为双精度浮点数。

    这种格式以 64 位存储数字,其中数字(小数)存储在 0 到 51 位,指数存储在 52 到 62 位,登录位 63:

    整数(没有句点或指数符号的数字)精确到 15 位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 2011-11-15
      • 2019-02-06
      • 2014-01-30
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多