js做四则运算时,精度丢失问题及解决方法
之前项目上出现过这样一个bug,就是明明两个数都是一样的但是就是莫名其妙的报出两个数不相等,导致流程无法继续下去
然后我把所有数据导出来,进行一对一比对,只是一个很耗时的过程,最终让我找到
因为js计算过后会出现计算精度丢失的问题 找到问题所在就好说了,然后就开始解决这个让我为难了好长时间的问题
废话不多说直接上代码
/** * 解决两个数相加精度丢失问题 * @param a * @param b * @returns {Number} */ function floatAdd(a, b) { var c, d, e; if(undefined==a||null==a||""==a||isNaN(a)){a=0;} if(undefined==b||null==b||""==b||isNaN(b)){b=0;} try { c = a.toString().split(".")[1].length; } catch (f) { c = 0; } try { d = b.toString().split(".")[1].length; } catch (f) { d = 0; } e = Math.pow(10, Math.max(c, d)); return (floatMul(a, e) + floatMul(b, e)) / e; } /** * 解决两个数相减精度丢失问题 * @param a * @param b * @returns {Number} */ function floatSub(a, b) { var c, d, e; if(undefined==a||null==a||""==a||isNaN(a)){a=0;} if(undefined==b||null==b||""==b||isNaN(b)){b=0;} try { c = a.toString().split(".")[1].length; } catch (f) { c = 0; } try { d = b.toString().split(".")[1].length; } catch (f) { d = 0; } e = Math.pow(10, Math.max(c, d)); return (floatMul(a, e) - floatMul(b, e)) / e; } /** * 解决两个数相乘精度丢失问题 * @param a * @param b * @returns {Number} */ function floatMul(a, b) { var c = 0, d = a.toString(), e = b.toString(); try { c += d.split(".")[1].length; } catch (f) {} try { c += e.split(".")[1].length; } catch (f) {} return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c); } /** * 解决两个数相除精度丢失问题 * @param a * @param b * @returns */ function floatDiv(a, b) { var c, d, e = 0, f = 0; try { e = a.toString().split(".")[1].length; } catch (g) {} try { f = b.toString().split(".")[1].length; } catch (g) {} return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), floatMul(c / d, Math.pow(10, f - e)); }
以上就解决js精度丢失
原理也很简单 就是很好的运用了我们小学所学的算术的小数相乘/相加/相减/相除后小数位的变化规律来进行精度的换算
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版