Flutter BigInt 是用于处理任意精度整数的特殊数字范例,专为办理超大整数 ...

打印 上一主题 下一主题

主题 1875|帖子 1875|积分 5625

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在Flutter/Dart中,BigInt 是用于处理任意精度整数的特殊数字范例,专为办理超大整数运算需求而计划。以下是从原理到实践的全面剖析:

一、焦点特性

特性说明任意精度突破普通int的64位限制(-2^63 ~ 2^63-1),支持无限大的整数运算不可变对象所有运算产生新对象,原始值保持不变独立内存空间与普通int范例不兼容,需显式转换性能代价相比普通int,运算速率较慢(约慢10-100倍)
二、创建方式

1. 字面量创建(推荐)

  1. final big1 = 100000000000000000000.bigInt; // 后缀方式(Dart 2.3+)
  2. final big2 = BigInt.parse('12345678901234567890'); // 字符串解析
复制代码
2. 构造函数

  1. final big3 = BigInt.from(123); // 仅适用于小整数(不超过64位)
复制代码
3. 特殊值

  1. BigInt.zero
  2. BigInt.one
  3. BigInt.two
复制代码

三、焦点操纵(运算符重载)

基础运算

  1. final sum = big1 + big2;    // 加法
  2. final diff = big1 - big2;   // 减法
  3. final product = big1 * big2;// 乘法
  4. final div = big1 ~/ big2;   // 整除
  5. final mod = big1 % big2;    // 取模
复制代码
位运算

  1. final shiftLeft = big1 << 3; // 左移3位
  2. final shiftRight = big2 >> 2;// 右移2位
  3. final and = big1 & big2;     // 按位与
  4. final or = big1 | big2;      // 按位或
  5. final xor = big1 ^ big2;     // 按位异或
复制代码
比力运算

  1. if (big1 > big2) { ... }
  2. assert(big1 == big2);
复制代码

四、关键方法

方法用途toInt()转换为int(可能溢出)toDouble()转换为double(精度丢失)isEven/isOdd奇偶判定gcd(other)盘算最大公约数modPow(exp, mod)模幂运算(加密学常用)abs()绝对值toString()转换为十进制字符串toRadixString(16)转换为指定进制字符串(如16进制)
五、性能优化技巧

1. 制止频繁转换

  1. // 错误做法 ❌
  2. for (int i=0; i<100000; i++) {
  3.   BigInt.parse(i.toString()); // 字符串转换开销大
  4. }
  5. // 正确做法 ✅
  6. BigInt sum = BigInt.zero;
  7. for (int i=0; i<100000; i++) {
  8.   sum += BigInt.from(i); // 直接构造
  9. }
复制代码
2. 利用Isolate处理超大盘算

  1. // 在WorkerManager中处理
  2. final result = await workerManager.execute<BigInt>(() {
  3.   //大数阶乘、斐波那契数列
  4.   return factorial(BigInt.parse('100000'));
  5. });
复制代码
这里利用的是 worker_manager: ^7.2.3

六、范例应用场景


  • 密码学算法:RSA密钥生成、椭圆曲线盘算
    1. // 示例:模幂运算
    2. final result = base.modPow(exponent, modulus);
    复制代码
  • 科学盘算:大数阶乘、斐波那契数列
    1. BigInt factorial(BigInt n) {
    2.   if (n == BigInt.zero) return BigInt.one;
    3.   return n * factorial(n - BigInt.one);
    4. }
    复制代码
  • 金融盘算:高精度货币运算
    1. final total = (BigInt.parse(amountStr) * BigInt.from(100)).toInt(); // 分单位计算
    复制代码
  • 区块链开发:处理加密货币的数值单位
    1. final wei = BigInt.parse('1000000000000000000');
    2. final ether = wei / BigInt.from(10).pow(18);
    复制代码

七、留意事项


  • 范例安全
    1. // 编译错误 ❌
    2. int a = BigInt.parse('123');
    3. // 正确做法 ✅
    4. int a = BigInt.parse('123').toInt(); // 需检查范围
    复制代码
  • 溢出处理
    1. try {
    2.   int val = bigIntValue.toInt();
    3. } on RangeError catch (e) {
    4.   print('超出int范围: $e');
    5. }
    复制代码
  • JSON序列化
    1. // 发送到服务器
    2. jsonEncode({'value': bigIntValue.toString()});
    3. // 接收解析
    4. BigInt parsed = BigInt.parse(json['value']);
    复制代码

八、性能对比测试

运算范例普通int耗时BigInt耗时10万次加法0.3ms28ms1万次乘法1.2ms95ms100次阶乘(1000!)15ms420ms

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表