Trabajando con números (I)

El trabajo con números, o matemático es muy importante en cualquier lenguaje de programación ya que nos permite hacer cosas que no creíamos, es por ello que vamos a dedicarle algunas entradas para aprender a manejarlos, aunque ya aprendimos las operaciones básicas en una entrada anterior basada en operadores.

En esta ocasión vamos a sacar el máximo partido del aparato matemático de JavaScript viendo como se trata de algo muy sencillo y si os pasa como a mí (me he pagado la carrera a base de clases particulares de matemáticas), os resultará hasta divertido…

Números

Vamos a comenzar desde prácticamente el principio, de modo que debemos diferenciar entre lo que es un número entero (5) y uno decimal (5.8) ya que en JS los números decimales se marcan con un punto (.) Aunque a la hora de diferenciarlos para declararlos no hay que hacer nada, JS los reconoce y trabaja con ellos, no hay que decirle de que tipo son como en otros lenguajes de programación.

var x = 5; //número entero
var y = 5.8; //número con coma
var v = 123e5; //12300000
var z = 123e-5; //0.00123

Como vemos en la declaración de variables de arriba podemos utilizar notación científica utilizando e como 10 elevado a 

Todo esto es muy interesante pero JS tiene un problema con los números y es que esta limitado a números enteros con 15 dígitos y a 17 decimales, pero eso no es todo en ocasiones las operaciones con números decimales pueden dar errores, como por ejemplo

var x = 0.2 + 0.1;
//da como resultado 0.30000000000000004

Lo cual es algo sorprendente, pero afortunadamente puede arreglarse si anulamos los decimales y jugamos un poco con los números, por ejemplo, en el ejemplo anterior bastaría con multiplicar por 10 cada factor y después de realizar la operación dividir entre 10. Ya que los errores no se cometen con números enteros.

var x = (0.2 * 10 + 0.1 * 10) / 10;
//el resultado ahora sí es 0.3

Sistemas de representación de números

De forma predeterminada JS presenta los números en la base decimal, pero se pueden utilizar otras bases, por ejemplo la hexadecimal:

var x = 0xFF; //este valor es 255

Pero supongamos que queremos hacer un cambio de base o presentar los valores en otras bases, para ello se utiliza el método toString() que veremos más adelante pero que ahora nos puede servir para entender el siguiente ejemplo:

var myNumber = 128;
myNumber.toString(16);     // (hexadecimal)devuelve 80
myNumber.toString(8);      // (octal)devuelve 200
myNumber.toString(2);      // (binario)devuelve 10000000

Infinito

Cuando estamos trabajando con números es bastante común que obtengamos el resultado infinito cuando se realizan algunas operaciones como en las divisiones entre cero. En ese momento aparecerán los valores Infinity y -Infinity

var x = 3/0;  // Infinity
var x = -3/0;  //-Infinity

NaN 

Bajo estas siglas se esconde el famoso Not a Number que aparece cuando hacemos una operación con elementos que no son números…

var x = 5*'rueda'; //el resultado es NaN

No obstante si la cadena puede interpretarse como un valor, JS lo hará y realizará la operación

var x = 5*'10'; //el resultado es 50

De este modo se puede identificar por medio de la función isNaN() si nuestro valor es o no un número, devolviendo true en caso de que no sea un número y false en caso de que sí lo sea.

var x = 5*'rueda';
isNaN(x); //el resultado en este caso sería true

Números como objetos

Aunque aun no hemos hablado demasiado de objetos, es interesante saber que los números pueden ser creados como valores primitivos (como explicamos en esta entrada) o bien como objetos y aunque se pueden hacer muchas operaciones combinando las dos formas vamos a ver sus semejanzas y diferencias…

var x = 123; 
var y = new Number(123);
//typeOf x devuelve number
//typeOf y devuelve object

Cuando creamos números como objetos ralentizamos la velocidad de nuestra aplicación y aunque utilicemos el comparador de igualdad == y nos de que son iguales, el de operador === nos devuelve true por que aunque en este caso el valor es el mismo entre x e y no son del mismo tipo. Pero es aun peor, ya que los objetos no se pueden comparar entre si…

Con esto terminamos la primera parte dedicada a los números, en la siguiente entrada estudiaremos los métodos numéricos que tiene Javascript