【Javascript】js精度丢失

打印 上一主题 下一主题

主题 827|帖子 827|积分 2496

当JS处置惩罚大整数或者浮点数的时候会出现精度丢失的环境。
Javascript的数字都利用双精度浮点数表现,遵照IEEE754标准
比如我碰到的问题,对一个小数的四舍五入,保留2位小数:
235.985≈235.98
235.9851≈235.99
原理请各人参考百度,本文只提供解决方案:
在JavaScript中处置惩罚精度丢失问题,可以采用以下方法:
1. 大整数处置惩罚



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



  • 转为整数盘算
    1. const result = (0.1 * 10 + 0.2 * 10) / 10; // 0.3
    复制代码
  • 利用第三方库(如decimal.js):
    1. import Decimal from 'decimal.js';
    2. const sum = new Decimal(0.1).plus(0.2).toString(); // "0.3"
    复制代码
3. 第三方库推荐



  • 大数运算:bignumber.js、math.js
  • 准确小数:decimal.js、big.js
4. JSON序列化BigInt



  • 自界说序列化方法:
    1. const data = { id: 12345678901234567890n };
    2. const json = JSON.stringify(data, (key, value) =>
    3.   typeof value === 'bigint' ? value.toString() : value
    4. );
    复制代码
5. 前后端协作



  • 明确数据格式:确保大概超出安全范围的字段(如ID、长整型)以字符串情势传输。
总结



  • 大整数:优先字符串传输,利用BigInt或库处置惩罚。
  • 浮点数:转为整数盘算或利用专用库。
  • 兼容性:检查BigInt支持环境,须要时引入Polyfill。
通过以上策略,可有用避免JavaScript中的精度丢失问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表