Curso básico de Java - #23 - Clases fundamentales: Math

Buenas compañeros,
En este tema trataremos sobre la clase Math.


La clase Math
Sirve para hacer diferentes operaciones de una manera mas sencilla mediante sus métodos, asi como también nos brinda valores como podría ser el de π mediante sus constantes.

Se encuentra en el paquete java.langpor lo que no necesita ser importada.


Metodos mas utiles
Consultar tambien la API para ver otros métodos interesantes.

Método Descripción Ejemplo
.abs(x) Devuelve el valor absoluto de x. Math.abs(-7) // Devuelve 7.
.round(x) Devuelve x redondeado a un numero entero (int). Math.round(1.5) // Devuelve 2.
.ceil(x) Devuelve x redondeado hacia arriba al entero más cercano (double). Math.ceil(6.1) // Devuelve 7.0.
.floor(x) Devuelve x redondeado hacia abajo al entero más cercano (double). Math.floor(10.7) // Devuelve 10.0.
.max(a, b) Devuelve el mayor de dos valores. Math.max(10, 20) // Devuelve 20
.min(a, b) Devuelve el menor de dos valores. Math.min(10, 20) // Devuelve 10
.pow(a, b) Devuelve el valor de a elevado a b. Math.pow(5, 2) // Devuelve 25.0.
.sqrt(x) Devuelve la raíz cuadrada de x. Math.sqrt(16) // Devuelve 4.0
.random() Devuelve un número pseudoaleatorio entre 0.0 y 1.0. * Math.random() // Devuelve 0.9477708648356935.

*Sobre Math.random(), recomiendo utilizar la clase Random (#24) ya que cuenta con funciones mucho mas cómodas y útiles que el método de Math. Ademas de ser mucho mas aleatoria. Siendo asi que este metodo no es confiable para tareas como criptografía o seguridad.

Geometria

Método Descripción Ejemplo
.sin(x) Devuelve el seno de un ángulo (x) en radianes. Math.sin(3.1416 / 2) // Devuelve 1.
.cos(x) Devuelve el coseno de un ángulo (x) en radianes. Math.cos(0) // Devuelve 1.
.tan(x) Devuelve la tangente de un ángulo (x) en radianes. Math.tan(3.1416 / 4) // Devuelve 1.
.toDegrees(x) Convierte radianes (x) a grados. Math.toDegrees(3.1416) // Devuelve 180.0.
.toRadians(x) Convierte grados (x) a radianes. Math.toRadians(180) // Devuelve 3.1416.

Constantes
La clase Math, a día de publicación de este tema solo cuenta con 3 constantes:

Constante Descripción Valor
Math.PI Almacena el valor de π (pi). 3.141592653589793
Math.E Almacena el valor de e ( Euler). 2.718281828459045
Math.TAU Almacena el valor de τ (tau o 2π). 6.283185307179586

Uso de Math
La clase Math no cuenta con un constructor y no se puede heredar de ella (final) Asi que si queremos acceder a sus métodos y constantes debemos hacerlo llamando a la clase de manera estática, sin declarar un objeto:

Math.[elemento];

Veamoslo con un ejemplo:

Mates.java
public class Mates
{
	public static void main(String[] args)
	{
		System.out.println("PI: " + Math.PI);
		System.out.println("E: " + Math.E);
		System.out.println("TAU: " + Math.TAU);
		System.out.println("Numero aleatorio entre 0 y 1: " + Math.random());
		System.out.println("Numero aleatorio entre 0 y 10: " + Math.round(Math.random() * 10));
		System.out.println("Numero aleatorio entre 0 y 100: " + Math.round(Math.random() * 100));
		System.out.println("7 elevado al cuadrado es: " + Math.pow(7, 2));
		System.out.println("La raíz cuadrada de 49 es: " + Math.sqrt(49));
		System.out.println("El mas grande entre 7 y -8 es: " + Math.max(7, -7));
	}
}
Output
PI: 3.141592653589793
E: 2.718281828459045
TAU: 6.283185307179586
Numero aleatorio entre 0 y 1: 0.14041686793497854
Numero aleatorio entre 0 y 10: 7
Numero aleatorio entre 0 y 100: 16
7 elevado al cuadrado es: 49.0
La raíz cuadrada de 49 es: 7.0
El mas grande entre 7 y -8 es: 7

En el siguiente tema veremos la clase Random la cual nos ayuda a generar desde caracteres hasta números aleatorios de manera cómoda y sencilla.

1 me gusta

nos puedes enseñar a modularizar el codigo en java? osea como poder hacer varias funciones modulares en diferentes class en varios archivos, como lo que hacen con las funciones de las librerias

edit: asi?

/*
 * Mates.java
 * 
 * ejemplo de moluradizacion de codigo
 */

public class Mates
{
    /**
     * Suma
     * 
     * sumar
     * 
     * @param Numero1 el numero primario
     * @param Numero2 el numero secundario
     */
    public static int Suma(int Numero1, int Numero2) { return Numero1 + Numero2; }
    
    /**
     * Resta
     * 
     * restar
     * 
     * @param Numero1 el numero primario
     * @param Numero2 el numero secundario
     */
    public static int Resta(int Numero1, int Numero2) { return Numero1 - Numero2; }
    
    /**
     * Multiplicacion
     * 
     * multiplicar
     * 
     * @param Numero1 el numero primario
     * @param Numero2 el numero secundario
     */
    public static int Multiplicacion(int Numero1, int Numero2) { return Numero1 * Numero2; }

    /**
     * Divicion
     * 
     * dividir
     * 
     * @param Numero1 el numero primario
     * @param Numero2 el numero secundario
     */
    public static int Divicion(int Numero1, int Numero2) { if (Numero1 == 0 || Numero2 == 0) return 0; return Numero1 / Numero2; }
}

es algo fundamental a la hora de hacer librerias para java, bueno segun he visto con C# o C++

Buenas,
Si te refieres a dividir tu programa en varias clases, con la teoría que existe en este curso deberías mas o menos comprenderlo.

Para comprender que son y que elementos tienen las clases y objetos en Java mírate los temas #9 y #10.

Y para entender cómo “conectar” las diferencias clases que hagamos mírate los temas #11, #12 y #13.

El tema #13 es un ejemplo funcional de como definir una clase y luego desde otra crear objetos de la primera.

Aunque, no todas las relaciones entre clases se basan en objetos. Por eso usamos elementos (atributos y métodos estáticos). En el temas #12 se habla más en profundidad sobre esto y se ve también los modificadores de acceso que nos permiten regular la utilización de estos elementos desde otras clases.

Si después de mirarte esto te queda alguna duda, presentamela y encantado te la intentaré solucionar.


Sobre el código que has escrito, la clase Mates, si lo que preguntas es como interactuar con ella sería de la siguiente manera:

Como los 4 métodos son estaticos (static) la forma correcta de llamarlos es la siguiente:

Mates.[metodo]();

Por ejemplo:

Mates.Suma(2, 7);

Ten en cuenta que como estos métodos devuelven valores, lo más normal es que hagamos algo con ellos, como podría ser guardarlos en una variable o imprimirlos.

Te dejo un ejemplo de como usaría tu clase desde otra diferente:

UsandoMates.java
public class UsandoMates
{
	/**
	 * Método principal.
	 * Utiliza e imprime el resultado de los métodos de la clase Mates.
	 */
	public static void main(String[] args)
	{
		System.out.println("5 + 2 = " + Mates.Suma(5, 2));
		System.out.println("5 - 2 = " + Mates.Resta(5, 2));
		System.out.println("7 x 5 = " + Mates.Multiplicacion(7, 5));
		System.out.println("10 + 2 = " + Mates.Divicion(10, 2));
	}
}

Output:

5 + 2 = 7
5 - 2 = 3
7 x 5 = 35
10 + 2 = 5

Esto funciona porque los las dos clases (sus archivos .class), Mates y UsandoMates, están en el mismo paquete o directorio:

~/lab$ tree
.
├── Mates.class
└── UsandoMates.class

1 directory, 2 files

~/lab$ java UsandoMates 
5 + 2 = 7
5 - 2 = 3
7 x 5 = 35
10 + 2 = 5

Si las separamos no podrán encontrarse:

~/lab$ tree
.
├── otroDir
│   └── Mates.class
└── UsandoMates.class

2 directories, 2 files

~/lab$ java UsandoMates 
Exception in thread "main" java.lang.NoClassDefFoundError: Mates
        at UsandoMates.main(UsandoMates.java:7)
Caused by: java.lang.ClassNotFoundException: Mates
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 1 more

La solucion? Importar el paquete o llamar a la clase incluyendo el nombre del paquete:

Para importar la clase, añadir en la primera linea del archivo:

import otroDir.Mates;

o añadir la ruta de directorio (paquete) al llamar un elemento de la clase:

System.out.println("7 x 5 = " + otroDir.Mates.Multiplicacion(7, 5));
1 me gusta