js problema y solución de precisión de cálculo de punto flotante

En javaScript, debido a que los números de punto flotante no son valores precisos, a menudo se producen resultados inesperados al realizar operaciones de punto flotante.

Considere el siguiente ejemplo:

0.1 + 0.2 === 0.3
// 结果返回 false

(0.3 - 0.2) === (0.2 - 0.1)
// 结果返回 false

Por lo tanto, tenga especial cuidado al calcular decimales, ya que debe procesarse para devolver el resultado esperado.

Entonces, ¿hay alguna forma de resolverlo?

No son muchas tonterías, solo ve al código. ¡Golpea la pizarra y dibuja los puntos clave!

class Precision {

    // 加法
    add(a, b) {
        let arr = this.core(a, b);
        return (arr[0] + arr[1]) / arr[2];
    }

    // 减法
    sub(a, b) {
        let arr = this.core(a, b);
        return (arr[0] - arr[1]) / arr[2]; 
    }

    // 乘法
    mul(a, b) {
        let arr = this.core(a, b);
        return arr[0] * arr[1] / Math.pow(arr[2],2);
    }

    // 除法
    div(a, b) {
        let arr = this.core(a, b);
        return arr[0] / arr[1];
    }

    // 核心代码
    core(a, b) {
        a = Number(a).toString();
        b = Number(b).toString();
        let a_pos = a.indexOf('.');
        let b_pos = b.indexOf('.');
        if(a_pos === -1 && b_pos === -1) {
            return [Number(a), Number(b), 1];
        } else {
            let [aPos, bPos] = [0, 0];
            if(a_pos !== -1) {
                aPos = a.length - (a_pos+1);
                a = a.replace('.', '');
            }
            if(b_pos !== -1) {
                bPos = b.length - (b_pos+1);
                b = b.replace('.', '');
            }
            if(aPos < bPos) {
                a += '0'.repeat(bPos - aPos);
            } else {
                b += '0'.repeat(aPos - bPos);
            }
            return [Number(a), Number(b), Math.pow(10, (aPos > bPos ? aPos : bPos))];
        }
    }
}

En realidad, la idea es convertir números de punto flotante en números enteros primero y luego realizar operaciones. Para métodos específicos, consulte el método principal en la clase Precision.

Código de prueba

let Compute = new Precision();  // 实例化Precision类

// 加法
var a = 0.1;
var b = 0.2;
console.log('直接加法运算 a + b =', a + b);
console.log('Precision.js加法运算 a + b =', Compute.add(a, b));

// 减法
var a = 1.0;
var b = 0.7;
console.log('直接减法运算 a - b =', a - b);
console.log('Precision.js减法运算 a - b =', Compute.sub(a, b));

// 乘法
var a = 1.01;
var b = 1.003;
console.log('直接乘法运算 a * b =', a * b);
console.log('Precision.js乘法运算 a * b =', Compute.mul(a, b));

// 除法
var a = 0.029;
var b = 10;
console.log('直接除法运算 a / b =', a / b);
console.log('Precision.js除法运算 a / b =', Compute.div(a, b));

resultado de la operación

Descripción

Cuando el parámetro de entrada no es un valor numérico y no se puede convertir en un valor numérico, el resultado del cálculo devuelve NaN

Supongo que te gusta

Origin blog.csdn.net/qczxl520/article/details/107974315
Recomendado
Clasificación