JavaScript——数字超过精度导致数据有误

2024-08-15 09:57:12 浏览数 (3)

前言

接口返回的number类型的数据,超过了JavaScript中Number类型的限制,浏览器自动进行了转换;

代码语言:javascript复制
console.log(7232167009634730040)

内容

以下内容来自Claude

JavaScript 的 Number 类型可以安全表示的最大整数是 2^53 - 1,也就是 9007199254740991。大于这个值的整数在 JavaScript 中会失去精度或变为 Infinity。例如:

代码语言:javascript复制
js
> 9007199254740991  // 最大安全整数 
9007199254740991

> 9007199254740992  
9007199254740992  // 超出范围,已经失去精度

> 7232167009634730040 
Infinity  // 超出 Number 范围,变为 Infinity

所以当我们需要在 JavaScript 中处理一个超过 Number 类型范围的超大整数时,需要注意几点:

  1. API 端返回科学计数法格式的字符串,如 "7.23216700963473e19"。然后前端解析为 Number 使用。这可以保证数字的精度。
  2. API 直接返回字符串,如 "7232167009634730040"。前端检查是否可以转为 Number,如果不能则使用字符串处理。这样也可以避免精度丢失的问题。
  3. API 返回支持大数的类型,如 String、Decimal 等。然后前端引入对应库处理。
  4. 在前后端共同配合下,返回和解析合适格式的数值。API 端返回适合的格式,前端选择合适的方法解析。这可以避免直接使用 Number 类型导致的超出范围问题。

总的来说,当涉及到特别大的数字时,单靠 JavaScript 的 Number 类型是无法很好表示和处理的。这时我们需要前后端共同来实现对超大整数的支持,通过返回和解析科学计数法字符串或使用其他支持大数的类型等手段,来避开 Number 类型的限制,精确地运算和表示超大整数。

0 人点赞