当前位置: 首页 > news >正文

JS的大数运算(注意:原生的只支持整数计算!!!)

JS的大数运算(注意:原生的只支持整数计算!!!)

  • 一、JS的大数运算(注意:原生的只支持整数计算!!!)
    • 1. 数字精度限制
    • 2. 大数解决方案
      • 2.1. 使用 BigInt
      • 2.2. 使用第三方库
    • 3. 总结
    • 4 补充:力扣1922. 统计好数字的数目 (中等) 使用大数运算的例子


一、JS的大数运算(注意:原生的只支持整数计算!!!)

JavaScript 在处理数字时,其默认的数值类型是基于 IEEE 754 标准的双精度浮点数。这个数值类型有一些限制,特别是在进行大数运算时。以下是 JavaScript 中大数运算的简单介绍:

1. 数字精度限制

  • 安全整数: JavaScript 支持的安全整数范围是 (-2^{53} + 1) 到 (2^{53} - 1)(即 Number.MAX_SAFE_INTEGER 的值为 9007199254740991)。超出这个范围的整数计算可能会出现精度丢失(例如, 9007199254740992 会变成 9007199254740992)。

  • 浮点数问题: 由于浮点数的表示方式,某些小数(如 0.10.2 的和)可能无法精确表示。

2. 大数解决方案

由于上述限制,处理大数运算时,可以考虑以下几种方案:

2.1. 使用 BigInt

从 ES2020 开始,JavaScript 引入了 BigInt 类型,用于表示任意大小的整数。你可以通过在数字后添加 “n” 来创建 BigInt:

const bigInt1 = BigInt(9007199254740992)
const bigInt2 = 12345678901234567890n // 后缀 "n" 表示 BigInt
const sum = bigInt1 + bigInt2         // 可以进行大数运算
console.log(sum)                       // 输出: 12345678901234567892n

console.log(Number(sum))  // 输出: 12345678901234567892

2.2. 使用第三方库

如果你需要支持比 BigInt 更广泛的数值(比如更复杂的数学操作、浮点数等),可以使用大数运算库,例如:

  • Decimal.js: 支持任意精度的十进制运算,适合处理小数。
  • Big.js: 提供了对大浮点数的高精度运算支持。
  • bignumber.js: 可以处理比较大的数值以及高精度的浮点数运算。

使用示例(以 decimal.js 为例):

const Decimal = require('decimal.js');

const a = new Decimal(0.1);
const b = new Decimal(0.2);
const sum = a.plus(b); // 精确计算
console.log(sum.toString()); // 输出: "0.3"

3. 总结

在 JavaScript 中,大数运算可以通过 BigInt 来实现任意大小的整数 整数 整数!!!计算,或使用第三方库来处理更复杂的场景(如浮点数和高精度计算)。在处理大数运算时,需要注意原生数值类型的限制,以确保计算的准确性。

4 补充:力扣1922. 统计好数字的数目 (中等) 使用大数运算的例子

链接:csdn链接–作者暂未提供
链接:力扣本题链接

代码如下:

/**
 * @param {number} n
 * @return {number}
 */
var countGoodNumbers = function (n) {
  // 此题无法使用暴力算法

  const MOD = BigInt(10 ** 9 + 7)

  // ai得到的逻辑思维:
  // 一个长度为n的字符串,偶数位置可以有02468五种选择,奇数位置可以有2357四种选择
  // 因此对其进行排列组合,可以得到好数字的个数一共是 (符合偶数位置的数字的个数 * 符合奇数位置的数字的个数)
  // 即 (5^evenFuhe) * (4^oddFuhe)

  const evenCount = BigInt(Math.ceil(n / 2)) // 偶数下标的数量
  const oddCount = BigInt(Math.floor(n / 2)) // 奇数下标的数量

  const count = (Fuhe(5n, evenCount, MOD) * Fuhe(4n, oddCount, MOD)) % MOD

  return Number(count)
}

// 快速幂运算的函数实现
const Fuhe = ( a, b, mod ) => {
  let ans = 1n
  a = a % mod
  while(b) {
    if( b & 1n) ans = (a * ans) % mod
    a = (a * a) % mod
    b >>= 1n
  }
  return ans
}

相关文章:

  • 四、Appium Inspector
  • 【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
  • 【AI大模型】大模型RAG技术Langchain4j 核心组件深入详解
  • C++项目 —— 基于多设计模式下的同步异步日志系统(2)(工厂模式)
  • CAD 像素点显示图片——CAD二次开发 OpenCV实现
  • c语言 open函数
  • 「OC」小白书读书笔记——Block的相关知识(下)
  • 实现vlan间的通信
  • 解决单设备号双目摄像头调用难题:经验分享与总结
  • 融媒体中心智能语音识别系统设计与实现
  • 第2个小脚本:批量读取所有英文txt文章内容提取高频的单词
  • Matlab学习笔记五十:循环语句和条件语句的用法
  • 【微服务架构】SpringSecurity核心源码剖析+jwt+OAuth(七):SpringSecurity中的权限管理
  • 【HD-RK3576-PI】系统更新与恢复
  • Spring MVC 是如何将 @RequestMapping 注解映射到对应的 Handler 方法?
  • 【大英赛】大英赛准备笔记
  • MCP基础学习计划详细总结
  • Vue3项目中的前缀和
  • C++ ------ 智能指针
  • 2025年常见渗透测试面试题-webshell免杀思路(题目+回答)
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • Manus向全球用户开放注册
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 英媒:英国首相住所起火,目前无人伤亡
  • 国家统计局今年将在全国开展两次人口固定样本跟访调查