Clases Number y Math de Java

Java Number

Generalmente, cuando necesitamos usar números, solemos usar los tipos de datos integrados, como:byte、int、long、doubleetc.

Ejemplo

int a = 5000; float b = 13.65f; byte c = 0x4a;

Sin embargo, en el proceso de desarrollo real, a menudo nos encontramos con situaciones en las que necesitamos usar objetos en lugar de tipos de datos integrados. Para resolver este problema, el lenguaje Java proporciona una clase envoltorio (wrapper) correspondiente para cada tipo de datos integrado.

Todas las clases envoltorio(Integer、Long、Byte、Double、Float、Short)son subclases de la clase abstracta Number.

Nombre de claseTipo primitivo correspondienteDescripción
BytebyteClase envoltorio del tipo byte
ShortshortClase envoltorio del tipo short
IntegerintClase envoltorio del tipo int
LonglongClase envoltorio del tipo long
FloatfloatClase envoltorio del tipo float
DoubledoubleClase envoltorio del tipo double
BigInteger-Entero inmutable de precisión arbitraria
BigDecimal-Número decimal con signo inmutable de precisión arbitraria

Java Number类

Este envoltorio, especialmente admitido por el compilador, se denomina autoboxing. Por lo tanto, cuando un tipo de datos integrado se usa como objeto, el compilador envuelve (boxea) el tipo integrado en su clase envoltorio. De manera similar, el compilador también puede desenvolver (unboxear) un objeto a un tipo de datos integrado.

La clase Number pertenece al paquete java.lang.

Number es una clase abstracta cuya función principal es proporcionar métodos de conversión unificados para varios tipos numéricos:

Ejemplo

public abstract class Number implements Serializable {
    // Métodos abstractos
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
   
    // Añadido en Java 8
    public byte byteValue() {
        return (byte)intValue();
    }
    public short shortValue() {
        return (short)intValue();
    }
}

A continuación se muestra un ejemplo que utiliza un objeto Integer:

Código del archivo Test.java:

public class Test{ public static void main(String[] args){ Integer x = 5; x = x + 10; System.out.println(x); } }

El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:

15

Cuando a x se le asigna un valor entero, como x es un objeto, el compilador debe aplicar autoboxing a x. Luego, para que x pueda realizar la operación de suma, debe aplicar unboxing a x.

Ejemplo de métodos comunes

Conversión de tipos primitivos

Ejemplo

Number num = 1234.56; // En realidad es de tipo Double

System.out.println(num.intValue());    // 1234 (truncando decimales)
System.out.println(num.longValue());   // 1234
System.out.println(num.floatValue());  // 1234.56
System.out.println(num.doubleValue()); // 1234.56

Comparación de valores numéricos

Ejemplo

java
Integer x = 10;
Double y = 10.0;

// Forma correcta de comparar: convertir al mismo tipo y luego comparar
System.out.println(x.doubleValue() == y.doubleValue()); // true

Manejo de valores numéricos especiales

Manejo de números grandes

Ejemplo

BigInteger bigInt = new BigInteger("12345678901234567890");
BigDecimal bigDec = new BigDecimal("1234567890.1234567890");

// Operaciones con números grandes
BigInteger sum = bigInt.add(new BigInteger("1"));
BigDecimal product = bigDec.multiply(new BigDecimal("2"));

Formato de valores numéricos

Ejemplo

NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);

System.out.println(nf.format(1234.5678)); // "1,234.57"

Autoboxing y unboxing

Java 5+ admite la conversión automática:

Ejemplo

// Autoboxing
Integer autoBoxed = 42; // El compilador lo convierte a Integer.valueOf(42)

// Unboxing automático
int autoUnboxed = autoBoxed; // El compilador lo convierte a autoBoxed.intValue()

Clase Math de Java

La clase Math es una clase de utilidades matemáticas proporcionada por Java, ubicada en el paquete java.lang, que contiene métodos estáticos para realizar operaciones numéricas básicas.

La clase Math de Java contiene propiedades y métodos para realizar operaciones matemáticas básicas, como exponentes elementales, logaritmos, raíces cuadradas y funciones trigonométricas.

Los métodos de Math están definidos como static, por lo que se pueden llamar directamente desde la clase Math en la función principal.

Código del archivo Test.java:

public class Test { public static void main (String []args) { System.out.println("Seno de 90 grados:" + Math.sin(Math.PI/2)); System.out.println("Coseno de 0 grados:" + Math.cos(0)); System.out.println("Tangente de 60 grados:" + Math.tan(Math.PI/3)); System.out.println("Arco tangente de 1:" + Math.atan(1)); System.out.println("Valor en grados de π/2:" + Math.toDegrees(Math.PI/2)); System.out.println(Math.PI); } }

El resultado de compilar y ejecutar el ejemplo anterior es el siguiente:

90 度的正弦值:1.0
0度的余弦值:1.0
60度的正切值:1.7320508075688767
1的反正切值: 0.7853981633974483
π/2的角度值:90.0
3.141592653589793

Operaciones matemáticas avanzadas

1. Operaciones con exponenciales y logaritmos

Ejemplo

Math.exp(1);    // e^1 ≈ 2.718
Math.log(Math.E); // ln(e) = 1
Math.log10(100); // log10(100) = 2

2. Generación de números aleatorios

Ejemplo

// Genera un número aleatorio entre [0.0, 1.0)
double random = Math.random();

// Genera un entero aleatorio entre [1, 100]
int randomInt = (int)(Math.random() * 100) + 1;

3. Otras operaciones

Ejemplo

Math.hypot(3, 4); // Calcula sqrt(x²+y²) → 5.0
Math.IEEEremainder(10, 3); // Resto IEEE → 1.0

4. Campos constantes

Ejemplo

Math.PI;    // π ≈ 3.141592653589793
Math.E;     // Base del logaritmo natural e ≈ 2.718281828459045

Métodos de las clases Number y Math

La siguiente tabla enumera algunos métodos comunes de las clases Number y Math:

N.º Método y descripción
1 xxxValue()
Convierte el objeto Number al tipo de dato xxx y devuelve el valor.
2 compareTo()
Compara el objeto number con el argumento.
3 equals()
Determina si el objeto number es igual al argumento.
4 valueOf()
Devuelve un objeto Number del tipo de datos integrado especificado.
5 toString()
Devuelve el valor en forma de cadena.
6 parseInt()
Analiza la cadena como tipo int.
7 abs()
Devuelve el valor absoluto del argumento.
8 ceil()
Devuelve el entero más pequeño mayor o igual (>=) que el argumento dado, de tipo double.
9 floor()
Devuelve el entero más grande menor o igual (<=) que el argumento dado.
10 rint()
Devuelve el entero más cercano al argumento. El tipo de retorno es double.
11 round()
Representaredondeo, el algoritmo esMath.floor(x+0.5), es decir, sumar 0.5 al número original y luego redondear hacia abajo. Por lo tanto, Math.round(11.5) da como resultado 12, y Math.round(-11.5) da como resultado -11.
12 min()
Devuelve el menor de los dos argumentos.
13 max()
Devuelve el mayor de los dos argumentos.
14 exp()
Devuelve el número e (base de los logaritmos naturales) elevado a la potencia del argumento.
15 log()
Devuelve el logaritmo natural (en base e) del argumento.
16 pow()
Devuelve el primer argumento elevado a la potencia del segundo argumento.
17 sqrt()
Calcula la raíz cuadrada aritmética del argumento.
18 sin()
Calcula el seno del argumento de tipo double especificado.
19 cos()
Calcula el coseno del argumento de tipo double especificado.
20 tan()
Calcula la tangente del argumento de tipo double especificado.
21 asin()
Calcula el arco seno del argumento de tipo double especificado.
22 acos()
Calcula el arco coseno del argumento de tipo double especificado.
23 atan()
Calcula el arco tangente del argumento de tipo double especificado.
24 atan2()
Convierte coordenadas cartesianas a coordenadas polares y devuelve el valor del ángulo polar.
25 toDegrees()
Convierte el argumento a grados.
26 toRadians()
Convierte ángulos a radianes.
27 random()
Devuelve un número aleatorio.

Comparación de ejemplos de los métodos floor, round y ceil de Math

Parámetro Math.floor Math.round Math.ceil
1.4 1 1 2
1.5 1 2 2
1.6 1 2 2
-1.4 -2 -1 -1
-1.5 -2 -1 -1
-1.6 -2 -2 -1

Ejemplos de floor, round y ceil:

public class Main { public static void main(String[] args) { double[] nums = { 1.4, 1.5, 1.6, -1.4, -1.5, -1.6 }; for (double num : nums) { test(num); } } private static void test(double num) { System.out.println("Math.floor(" + num + ")=" + Math.floor(num)); System.out.println("Math.round(" + num + ")=" + Math.round(num)); System.out.println("Math.ceil(" + num + ")=" + Math.ceil(num)); } }

El resultado de ejecutar el ejemplo anterior es:

Math.floor(1.4)=1.0
Math.round(1.4)=1
Math.ceil(1.4)=2.0
Math.floor(1.5)=1.0
Math.round(1.5)=2
Math.ceil(1.5)=2.0
Math.floor(1.6)=1.0
Math.round(1.6)=2
Math.ceil(1.6)=2.0
Math.floor(-1.4)=-2.0
Math.round(-1.4)=-1
Math.ceil(-1.4)=-1.0
Math.floor(-1.5)=-2.0
Math.round(-1.5)=-1
Math.ceil(-1.5)=-1.0
Math.floor(-1.6)=-2.0
Math.round(-1.6)=-2
Math.ceil(-1.6)=-1.0
Otras extensiones