当前位置: 首页 > news >正文

【Javascript】js精度丢失

当JS处理大整数或者浮点数的时候会出现精度丢失的情况。
Javascript的数字都使用双精度浮点数表示,遵循IEEE754标准

比如我遇到的问题,对一个小数的四舍五入,保留2位小数:
235.985≈235.98
235.9851≈235.99
原理请大家参考百度,本文只提供解决方案:
在JavaScript中处理精度丢失问题,可以采用以下方法:

1. 大整数处理

  • 使用字符串传输:与后端约定,将大整数(如ID)作为字符串返回,避免JSON解析时转为不准确的Number。
  • JSON解析处理:使用JSON.parse的reviver函数检测并转换大数为字符串:
    JSON.parse(jsonString, (key, value) => {
      if (typeof value === 'number' && (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER)) {
        return value.toString(); // 转换为字符串
      }
      return value;
    });
    
  • 使用BigInt类型:对需要运算的大整数,使用ES6的BigInt
    const bigNum = BigInt("12345678901234567890"); // 使用字符串初始化
    console.log(bigNum + 1n); // 运算需使用同类型
    

2. 浮点数精度问题

  • 转为整数计算
    const result = (0.1 * 10 + 0.2 * 10) / 10; // 0.3
    
  • 使用第三方库(如decimal.js):
    import Decimal from 'decimal.js';
    const sum = new Decimal(0.1).plus(0.2).toString(); // "0.3"
    

3. 第三方库推荐

  • 大数运算bignumber.jsmath.js
  • 精确小数decimal.jsbig.js

4. JSON序列化BigInt

  • 自定义序列化方法:
    const data = { id: 12345678901234567890n };
    const json = JSON.stringify(data, (key, value) => 
      typeof value === 'bigint' ? value.toString() : value
    );
    

5. 前后端协作

  • 明确数据格式:确保可能超出安全范围的字段(如ID、长整型)以字符串形式传输。

总结

  • 大整数:优先字符串传输,使用BigInt或库处理。
  • 浮点数:转为整数计算或使用专用库。
  • 兼容性:检查BigInt支持情况,必要时引入Polyfill。

通过以上策略,可有效避免JavaScript中的精度丢失问题。

相关文章:

  • uni小程序wx.switchTab有时候跳转错误tab问题,解决办法
  • Redis除了做缓存还有哪些应用场景
  • 记一次高并发下导致的数据库死锁解决方案
  • Docker和K8S中pod、services、container的介绍和关系
  • 【3DMAX科研绘图】3DMAX一键生成极小曲面插件Gyroid使用方法
  • DeepSeek入门学习
  • 计算机网络基础简答题资料(对口高考)
  • 【C++】模板初阶
  • 力扣hot100——前k个高频元素 (优先队列法,相关总结文章见另一博客)
  • 大中型虚拟化园区网络设计
  • 重生之我在学校学习Linux创造系统命令
  • GitHub高效搜索工具
  • 优选算法的智慧之光:滑动窗口专题(一)
  • 材料分析方法和特点
  • 【汽车ECU电控数据管理篇】HEX文件格式解析篇章
  • 如何使用SaltStack批量替换SSL证书方案
  • Java 大视界 -- Java 大数据在智慧环保污染源监测与预警中的应用(104)
  • HTML 日常开发常用标签
  • TaskBuilder设置排序条件
  • c++_sort函数
  • 证券日报:降准今日正式落地,年内或还有降准空间
  • 终于越过萨巴伦卡这座高山,郑钦文感谢自己的耐心和专注
  • 观察|本轮印巴冲突或促使印度空军寻求更先进战机
  • 昆明警方重拳打击经济领域违法犯罪:去年抓获905名嫌犯
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • 图讯丨习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式