之前知道就知道 js 的小數計算就存在精度問題,好比說 0.1+0.2 != 0.3,出現的緣由就是底層的十進制和二進制的轉換問題,而後也看到一些解決方法,而後在網上看到一些解決辦法
例git
Math.formatFloat = function(f, digit) { var m = Math.pow(10, digit); return parseInt(f * m, 10) / m; } var A = 0.1; var B = 0.2; console.log(Math.formatFloat(A + B, 1) === 0.3);
上面的解決辦法的確解決了 0.1 + 0.2 的問題,由於 0.1 + 0.2 = 0.300xxx4。
可是若是是 15.122222222 + 15.111111111 呢,那麼就出現問題了,他倆相加等於 30.233333332999997 這裏已經把最後一個 3 轉換爲 2999997 了。
那麼再用上述的方法就出錯了,因此在本身寫了一個改進的方法其中包括加減乘除運算算法
Math.formatFloat = function (n, m, rule) { let digit if (n > m) { for (let i = 1; i < 20; i++) { if (m * Math.pow(10, i) == parseInt(m * Math.pow(10, i))) { digit = i break } } } else { for (let i = 1; i < 20; i++) { if (n * Math.pow(10, i) == parseInt(n * Math.pow(10, i))) { digit = i break } } } const multiple = Math.pow(10, digit) switch (rule) { case '+': return parseInt((n * multiple + m * multiple), 10) / multiple break case '-': return parseInt((n * multiple - m * multiple), 10) / multiple break case '*': return parseInt((n * multiple * m * multiple), 10) / multiple / multiple break case '/': return parseInt((n * multiple / m * multiple), 10) / multiple / multiple break default: return '未知算法' } }
而後通過測試發現是可行的,還實驗了一些小數測試,發現是可行的,可是有的狀況是沒測試到的,若是有其餘的錯誤請指出讓我改正。。。測試