Fundamentos de JavaScript 2018

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

JavaScript puede llegar a tener comportamientos muy extraños. Uno de ellos es como trata a los decimales y es que JS no es muy preciso con ellos, haciendo operaciones sin sentido como:

3 * 10.3; 
//el resultado debería ser 30.9
//pero JS da 30.900000000000002

Este comportamiento errático de JavaScript puede llevar a errores fatales en nuestras aplicaciones. Entonces, ¿Cómo arreglo esto?
Pues en este mismo curso se propone una solución, pero… la verdad es que no es muy robusta.

Esta es la solución que se propone:

let price = 10.3;

let total = 3 * price; 
//el resultado debería ser 30.9
//pero js da 30.900000000000002

//para arreglarlo
total = Math.round( 3 * 100 * price ) / 100;
//primero multiplicamos el numero por 100 para trabajar con un entero
//si en el resultado de esa operación hay decimales se redondean
//y se divide entre 100 para volver a pasarlo a decimales

Si eres observador habrás notado que aquí hay un problema… esto solo sirve para números con dos decimales, esta limitación viene del 100 por el que multiplicamos y dividimos. Este numero debe tener la misma cantidad de ceros que decimales la variable price.
Eso es lo que te enseñaré aquí, como hacer que la cantidad de ceros sea dinámica.

let number = 9.639;
let decimalNumbers = number.toString();

//se toman los números después del punto
decimalNumbers = decimalNumbers.substr( decimalNumbers.indexOf(".") + 1, decimalNumbers.length - 1 );

let decimalNumbersLength = decimalNumbers.length;

//se eleva el 10 a la cantidad de números decimales que hay
//para tener un numero con la misma cantidad de ceros que decimales
let fixNumber = 10 ** decimalNumbersLength; 

total = Math.round( 3 * fixNumber * number ) / fixNumber;
<h3>Espero que te haya servido. 😉💚</h3>

Fundamentos de JavaScript 2018

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados