Tutorial de Java

Clases Java

Anterior | Siguiente

La Clase Math

La clase Math representa la librería matemática de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propósito de agrupación, por eso se encapsulan en Math, y lo mismo sucede con las demás clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc.). El constructor de la clase es privado, por los que no se pueden crear instancias de la clase. Sin embargo, Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla.

Funciones Matemáticas

Si se importa la clase, se tiene acceso al conjunto de funciones matemáticas estándar:

Math.abs( x ) para int, long, float y double
Math.sin( double a ) devuelve el seno del ángulo a en radianes
Math.cos( double a ) devuelve el coseno del ángulo a en radianes
Math.tan( double a ) devuelve la tangente del ángulo a en radianes
Math.asin( double r ) devuelve el ángulo cuyo seno es r
Math.acos( double r ) devuelve el ángulo cuyo coseno es r
Math.atan( double r ) devuelve el ángulo cuya tangente es r
Math.atan2(double a,double b) devuelve el ángulo cuya tangente es a/b
Math.exp( double x ) devuelve e elevado a x
Math.log( double x ) devuelve el logaritmo natural de x
Math.sqrt( double x ) devuelve la raíz cuadrada de x
Math.ceil( double a ) devuelve el número completo más pequeño mayor o igual que a
Math.floor( double a ) devuelve el número completo más grande menor o igual que a
Math.rint( double a ) devuelve el valor double truncado de a
Math.pow( double x,double y ) devuelve y elevado a x
Math.round( x ) para double y float
Math.random() devuelve un double
Math.max( a,b ) para int, long, float y double
Math.min( a,b ) para int, long, float y double
Math.E para la base exponencial, aproximadamente 2.72
Math.PI para PI, aproximadamente 3.14

El ejemplo java800.java, muestra la utilización de algunas de las funciones de la clase Math:

class java800 {
    public static void main( String args[] ) {
        int x;
        double rand,y,z;
        float max;

        rand = Math.random();
        x = Math.abs( -123 );
        y = Math.round( 123.567 );
        z = Math.pow( 2,4 );
        max = Math.max( (float)1e10,(float)3e9 );

        System.out.println( rand );
        System.out.println( x );
        System.out.println( y );
        System.out.println( z );
        System.out.println( max );
        
    }

Precisión arbitraria

La inclusión de la conectividadcon bases de datos SQL , obligó a definir en Java una nueva forma de trabajar con datos SQL de tipo NUMERIC y DECIMAL , que requieren precisión absoluta. Como resultado surgieron las clases BigDecimal y BigInteger, que permiten trabajar con precisión arbitraria, para representar datos que son habituales de las Bases de Datos, como puede ser la deuda pública de un país en una moneda pequeña, como pueda se la lira italiana.

La clase BigInteger también resulta útil cuando los tipos primitivos de Java (byte, int, long) no proporcionan sufiente precición. Por ejemplo, cuando se está construyendo una clave pública para encriptación que involucra operaciones exponenciales muy grantes y a manipular números primos de cientos de bits, y esta clase es ideal para estas acciones

El constructor más sencillo es el que construye un BigDecimal a partir de su representación como cadena:

BigDecimal( String s );

Aunque la cadena no puede contener ningún signo no numérico, ni siquiera espacios en blanco, ya que de lo contrario se produce una excepción de tipo NumberFormatException.

Un método interesante es el que permite fijar la precisión que se desea tener, es decir, el número de dígitos significativos que hay depués de la coma decimal, y el tipo de redondeo que se va a utilizar:

setScale( int precision,int redondeo );

Los operadores que se utilizan con estas clases no son los clásicos, sino que están disponibles métodos especiales para sumar, restar, multiplicar dividir y para desplazar la coma decimal un número determinado de posiciones a derecha o izquierda:

add( BigDecimal a );
substract( BigDecimal a );
multiply( BigDecimal a );
divide( BigDecimal a,int modo_redondeo );
movePointRight( int posiciones );
movePointLeft( int posiciones );

Una aplicación ya clásica es la muestra el ejemplo java801.java, que calcula una constante conocida con un número determinado de decimales, en este caso la constante e. Aunque no es la forma óptima de calcularla, porque hay otras que convergen más rápidamente, se puede zomar una aproximación con z=200 y una precisión de 300 dígitos, utilizando la fórmula siguiente:

Y el código de este ejemplo tan sencillo que implementa la fórmula es el que se muestra a continuación:

import java.math.*;

class java801 {
    public static void main( String args[] ) {
        BigDecimal e;
        BigDecimal factor;

        e = new BigDecimal( "1" ).setScale( 300,BigDecimal.ROUND_DOWN );
        factor = new BigDecimal( "1" ).setScale( 300,BigDecimal.ROUND_DOWN );

        // Se obtiene la expresión del paréntesis de la fórmula
        factor = factor.divide( new BigDecimal( 200 ),BigDecimal.ROUND_DOWN );
        factor = factor.add( new BigDecimal( 1 ) );
        // Se multiplica la expresión para obtener la potencia adecuada
        for( int i=1; i < 200; i++ )
            e = e.multiply( factor );
 
        System.out.println( e );
        }    
    }

Cuando se ejecute el ejemplo es conveniente hacerlo con el comando:

%java java801 | more

para que la pantalla no se llene con una cantidad impresionante de cifras que van a impedir que las primeras queden visibles el tiempo suficiente para darse cuenta de que están ahí.

La Clase Character

Al trabajar con caracteres se necesitan muchas funciones de comprobación y traslación. Estas funciones están empleadas en la clase Character. De esta clase sí que se pueden crear instancias, al contrario que sucede con la clase Math.

Declaraciones

La primera sentencia creará una variable carácter y la segunda un objeto Character:

char c;
Character C;

Comprobaciones booleanas

Character.isLowerCase( char ) devuelve true si el carácter es una letra minúscula
Character.isUpperCase( char ) devuelve true si el carácter es una letra mayúscula
Character.isDigit( char ) devuelve true para caracteres numéricos
Character.isSpace( char ) devuelve true para espacios en blanco

En este caso, si tuviésemos un objeto Character C , no se podría hacer C.isLowerCase(), porque no se ha hecho un new de Character. Estas funciones son estáticas y no conocen al objeto, por eso hay que crearlo antes.

Traslaciones de Caracteres

Character.toLowerCase( char ) convierte entre mayúscula y minúscula
Character.toUpperCase( char ) convierte entre minúscula y mayúscula

Traslaciones de carácter/dígito

int i = Character.digit( c,base );
char c = Character.forDigit( i,base );

Métodos de la clase Character

C = new Character( 'J' );
char c = C.charValue();
String s = C.toString();

Navegador

Home | Anterior | Siguiente | Indice | Correo