js 小數精度問題

之前知道就知道 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 '未知算法'
    }
}

而後通過測試發現是可行的,還實驗了一些小數測試,發現是可行的,可是有的狀況是沒測試到的,若是有其餘的錯誤請指出讓我改正。。。測試

相關文章
相關標籤/搜索