Estamos usando Realm como base de datos local.
const testConversion = (feet: number, inches: number) => { const cmTotal = feet * 30.48 + inches * 2.54; const feetNew = Math.floor(cmTotal / 30.48); // How to have inches match up? const inchesNew = (cmTotal % 30.48) * 0.393701; expect(feetNew).toEqual(feet); expect(inchesNew).toEqual(inches); }; // 12 inch in a feet // tallest man about is about 9 feet describe("Height conversion from metric to imperial", () => { it("Amount of stone and lb should stay the same", () => { testConversion(6, 0); for (let feet = 0; feet < 9; feet++) { for (let inches = 0; inches < 12; inches++) { testConversion(feet, inches); } } }); });Resultado:
● No se pudo ejecutar el conjunto de pruebas
expect(received).toEqual(expected) // deep equality Expected: 0 Received: 12.000006479999998 8 | 9 | expect(feetNew).toEqual(feet); > 10 | expect(inchesNew).toEqual(inches); | ^ 11 | };Redondear pulgadas de diferentes maneras no parece ayudar, el resultado final siempre está mal de alguna manera. ¿Alguna idea de cómo hacer aparte de guardar pies y pulgadas en campos separados en db?
Los cálculos de punto flotante nunca son precisos ( ¿Están rotas las matemáticas de punto flotante? ). Y debido a eso, su cmTotal % 30.48 in (cmTotal % 30.48) * 0.393701; es problemático
Usted espera que: 182.88 % 30.48 da como resultado 0 pero, sin embargo, da como resultado 30.479999999999993 debido a las imprecisiones de la aritmética de coma flotante.
Lo que quiere hacer es que el resultado de newInch dependa del resultado que calculó para feetNew :
(cmTotal - feetNew * 30.48) * 0.393701;
Y en su prueba no debe expect(inchesNew).toEqual(inches); porque no puede esperar que los números de dicha conversión sean exactamente iguales. Siempre tendrás algún pequeño error. Así que probablemente quieras usar algo como toBeCloseTo en su lugar.
let feet = 6 let inches = 0 const testConversion = (feet, inches) => { const cmTotal = feet * 30.48 + inches * 2.54; const feetNew = Math.floor(cmTotal / 30.48); // How to have inches match up? const inchesNew = (cmTotal - feetNew * 30.48) * 0.393701; console.log(feet, feetNew) console.log(inches, inchesNew) }; testConversion(6, 0)