关于精度丢失问题
在做进销存时,遇到精度丢失的问题,就记一下
在JavaScript里,如果你认为0.1+0.2会等于0.3,你就错了,答案是0.30000000000000004
计算机的二进制实现和位数限制有些数无法有限表示
就像一些无理数不能有限表示,如 圆周率 3.1415926...
此时只能模仿十进制进行四舍五入了,但是二进制只有 0 和 1 两个,于是变为 0 舍 1 入
这即是计算机中部分浮点数运算时出现误差,丢失精度的根本原因
那要怎么解决呢
思路的话是转变成整数去处理,之后再还原成小数
整数只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度
//加or减 减的话相当加一个负数 function add(n1, n2) { var s1, s2, m; try { s1 = n1.toString().split(".")[1].length; } catch (e) { s1 = 0; } try { s2 = n2.toString().split(".")[1].length; } catch (e) { s2 = 0; } m = Math.pow(10, Math.max(s1, s2)); return (n1 * m + n2 * m) / m; } //乘 function ride(arg1, arg2) { if (arg1 == null || arg2 == null) { return null; } var n1, n2; var r1, r2; // 小数位数 try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } n1 = Number(arg1.toString().replace(".", "")); n2 = Number(arg2.toString().replace(".", "")); return n1 * n2 / Math.pow(10, r1 + r2); } //除 function except(arg1, arg2) { if (arg1 == null) { return null; } if (arg2 == null || arg2 == 0) { return null; } var n1, n2; var r1, r2; // 小数位数 try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } n1 = Number(arg1.toString().replace(".", "")); n2 = Number(arg2.toString().replace(".", "")); return (n1 / n2) * Math.pow(10, r2 - r1); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」