/** * BigInt工具类 - 用于处理大整数的JSON序列化和反序列化 * 解决JavaScript Number类型精度限制问题(最大安全整数为2^53-1) */ export default class BigIntUtils { /** * 将大整数转换为字符串,避免JSON序列化时精度丢失 * @param value 大整数值 * @returns 字符串形式的大整数 */ static toString(value: number | string): string { if (typeof value === 'string') { return value; } return value.toString(); } /** * 将字符串转换为数字(如果安全的话) * @param value 字符串形式的大整数 * @returns 数字或字符串 */ static toNumber(value: string): number | string { const num = Number(value); // 检查是否超出安全整数范围 if (Number.isSafeInteger(num)) { return num; } return value; // 返回字符串以保持精度 } /** * 检查是否为安全整数 * @param value 要检查的值 * @returns 是否为安全整数 */ static isSafeInteger(value: number): boolean { return Number.isSafeInteger(value); } /** * 获取最大安全整数 * @returns 最大安全整数 */ static getMaxSafeInteger(): number { return Number.MAX_SAFE_INTEGER; // 2^53 - 1 } /** * 格式化大整数显示 * @param value 大整数值(字符串或数字) * @returns 格式化后的字符串 */ static format(value: number | string): string { const str = this.toString(value); return str.replace(/\B(?=(\d{3})+(?!\d))/g, ','); } /** * 比较两个大整数 * @param a 第一个值 * @param b 第二个值 * @returns 比较结果 (-1: ab) */ static compare(a: number | string, b: number | string): number { const strA = this.toString(a); const strB = this.toString(b); if (strA.length !== strB.length) { return strA.length > strB.length ? 1 : -1; } return strA.localeCompare(strB); } }