之前項目上出現過這樣一個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精度丟失
原理也很簡單 就是很好的運用了我們小學所學的算術的小數相乘/相加/相減/相除后小數位的變化規律來進行精度的換算