Flutter 使用 fixnum 解决 OpenHarmony 64 位大整数精度丢失问题
前言
在进行 OpenHarmony 的跨平台开发时,你可能会遇到一个诡异的 Bug:同样的 64 位长整数(如 Int64),在鸿蒙原生(Native)模式下运行正常,但编译为 Flutter Web 模式在浏览器运行时,数值却发生了精度漂移或溢出。
- 产生原因:JavaScript 原生的数字类型实质上是 64 位浮点数,它能安全表示的最大整数只有 53 位($2^{53} - 1$)。
- 后果:大额订单 ID、高精度的金融分位值、或是底层硬件的 64 位地址位,在 Web 容器中会因精度丢失而产生致命错误。
fixnum 软件包是 Google 官方出品的补丁工具。它为 Dart 提供了纯正、一致的 Int64(64 位有符号整数)和 Int32(32 位有符号整数)类,确保你的鸿蒙应用在任何环境下都能保证计算结果的绝对一致。
一、精度对齐计算模型
fixnum 通过软件模拟的方式,在不支持原生 64 位整数的环境下实现了位运算对齐。
| 执行环境 | 大整数载荷 (64-bit) | fixnum Int64 封装类 |
|---|---|---|
| 鸿蒙 Native (原生支持) | 原生支持 | N/A |
| 鸿蒙 Web 容器 (JS 模拟支持) | JS 模拟支持 | 位运算 / 算术运算 (一致性模拟) |
二、核心 API 实战
2.1 创建并操作 Int64
import 'package:fixnum/fixnum.dart';
void useInt64() {
// 💡 即使在 Web 端,也能安全表示超过 53 位的数字
Int64 veryLargeId = Int64.parse('9223372036854775807'); // 最大正整数
// 执行位运算(与、或、非、位移)
Int64 shifted = veryLargeId >> 2;
print('鸿蒙设备审计 ID: $veryLargeId');
}

2.2 跨平台安全加减
Int64 price = Int64(1024);
Int64 sum = price * 1000000000; // 💡 自动处理溢出检测




