BigIntUtils.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * BigInt工具类 - 用于处理大整数的JSON序列化和反序列化
  3. * 解决JavaScript Number类型精度限制问题(最大安全整数为2^53-1)
  4. */
  5. export default class BigIntUtils {
  6. /**
  7. * 将大整数转换为字符串,避免JSON序列化时精度丢失
  8. * @param value 大整数值
  9. * @returns 字符串形式的大整数
  10. */
  11. static toString(value: number | string): string {
  12. if (typeof value === 'string') {
  13. return value;
  14. }
  15. return value.toString();
  16. }
  17. /**
  18. * 将字符串转换为数字(如果安全的话)
  19. * @param value 字符串形式的大整数
  20. * @returns 数字或字符串
  21. */
  22. static toNumber(value: string): number | string {
  23. const num = Number(value);
  24. // 检查是否超出安全整数范围
  25. if (Number.isSafeInteger(num)) {
  26. return num;
  27. }
  28. return value; // 返回字符串以保持精度
  29. }
  30. /**
  31. * 检查是否为安全整数
  32. * @param value 要检查的值
  33. * @returns 是否为安全整数
  34. */
  35. static isSafeInteger(value: number): boolean {
  36. return Number.isSafeInteger(value);
  37. }
  38. /**
  39. * 获取最大安全整数
  40. * @returns 最大安全整数
  41. */
  42. static getMaxSafeInteger(): number {
  43. return Number.MAX_SAFE_INTEGER; // 2^53 - 1
  44. }
  45. /**
  46. * 格式化大整数显示
  47. * @param value 大整数值(字符串或数字)
  48. * @returns 格式化后的字符串
  49. */
  50. static format(value: number | string): string {
  51. const str = this.toString(value);
  52. return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  53. }
  54. /**
  55. * 比较两个大整数
  56. * @param a 第一个值
  57. * @param b 第二个值
  58. * @returns 比较结果 (-1: a<b, 0: a=b, 1: a>b)
  59. */
  60. static compare(a: number | string, b: number | string): number {
  61. const strA = this.toString(a);
  62. const strB = this.toString(b);
  63. if (strA.length !== strB.length) {
  64. return strA.length > strB.length ? 1 : -1;
  65. }
  66. return strA.localeCompare(strB);
  67. }
  68. }