elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Representación de un número
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Representación de un número  (Leído 3,891 veces)
maikmilk

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Representación de un número
« en: 5 Junio 2012, 17:04 pm »

El problema es el siguiente para representar en java un número en java muy grande el numero se representa de la siguiente forma "2.305843009213694E18" o sea el número elevado a algo

Hay forma de representar el número tal cual??

Yo e encontrado lo siguiente:

Código
  1. import java.util.*;
  2. import java.text.*;
  3. import java.io.*;
  4.  
  5. public class prueba
  6. {
  7.    public static void main(String args[])
  8.    {
  9.        DecimalFormat decimal = new DecimalFormat("");
  10.  
  11.        double op = (Math.pow(2,61))-1;
  12.        System.out.println(op);
  13.        System.out.println(decimal.format(op));
  14.    }
  15. }

"DecimalFormat decimal = new DecimalFormat("")"

Pero el número que sale por pantalla es el siguiente:

Código
  1. 2.305843009213694E18
  2. 2.305.843.009.213.694.000

O sea el número 2.305.843.009.213.694.000 cuando realmente 2^61 es 2305843009213693951, por que se pierde tanta precisión?


En línea

lluvplay

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Representación de un número
« Respuesta #1 en: 5 Junio 2012, 17:46 pm »

hola amigo!!! creo que tu solucion es usar el tipo de dato BigDecimal de la libreria Math
yo he probado con tu código y la transformación y pues listo me a funcionado.
Espero haber podido ayudar !!!! saludos.

Código:
public class Prueva {

    public static void main(String[] args)
{
        double op = (Math.pow(2,61));
        BigDecimal opp= new BigDecimal(op);
        System.out.println(opp);
   }
}
listo probado en mi calculadora y en mi pc !!!
Anexo un ultimo datito BigDecimal de ta precicion!!!
 ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)


En línea

* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !
maikmilk

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Re: Representación de un número
« Respuesta #2 en: 5 Junio 2012, 18:34 pm »

Perfecto!!!

Mi ultima duda es posible ahora almacenar esa variable opp en un double o en un long?

Porque a la hora de usarla en condicionales un BigDecimal no lo puedo usar ya que da un error "incomparable types: java.math.BigDecimal and int".

Todo esto sin perder precisión.
En línea

lluvplay

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Representación de un número
« Respuesta #3 en: 5 Junio 2012, 18:57 pm »

Puedes ser un poco mas especifico con lo que se quiere condicionar ?

ejemplo si queremos condicionar

double respuesta=math.pow(2,61);

if (respuesta ==2.305843009213694E18)
 /// sentencias si es cierto
else
// sentencias si es falso

condicionalo asi q es igual !!!
solo sinecesitas mostrar resultados as la tranformacion a BigDecimal.

ejemplo
BigDecimal respuesta_de_bigdecimal= new BigDecimal(respuesta);
System.out.print(respuesta_de_bigdecimal);

pero si tienes q hacer bajo codigo he operaciones algebraicas y condiciones mi recomendacion es q lo trates con double y conviertas al final lo q es salida !!!

he intentado convertir el valor pero me devuelve valores con letras !!! asiq ps noc si estoy aclarando la duda pero hay vamos cualquiera cosa comentemos y listo !!!

Saludos....  ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::) ::)

En línea

* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !
maikmilk

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Re: Representación de un número
« Respuesta #4 en: 5 Junio 2012, 19:08 pm »

esta noche te he enseño todo el código y el problema en concreto
En línea

maikmilk

Desconectado Desconectado

Mensajes: 26



Ver Perfil
Re: Representación de un número
« Respuesta #5 en: 5 Junio 2012, 22:18 pm »

Código
  1. import java.util.*;
  2. import java.io.*;
  3. import java.math.*;
  4. /**
  5.  * Calculo de la secuencia de Mersenne [(2^n)-1] y comprobación de si el número
  6.  * es primo o no.
  7.  * Salida por pantalla y guardada en .txt indicando si el numero obtenido es primo y la secuencia de Mersenne
  8.  */
  9. public class Mersenne
  10. {
  11.    public static void primosMersenne(double n)
  12.    {
  13.        Calendar tiempo = Calendar.getInstance();
  14.        File f = new File("/Users/Miki/Desktop/Datos.txt");
  15.        try
  16.        {
  17.            PrintWriter pw = new PrintWriter(new FileOutputStream(f,true));
  18.            pw.println("Calculo de la secuencia de Mersenne y de sus números primos");
  19.            pw.println("-----------------------------------------------------------");
  20.            for(int i = 2; i <= n; i++)
  21.            {
  22.                double op = (Math.pow(2,i)-1);
  23.                BigDecimal uno = new BigDecimal(op);
  24.                BigDecimal dos = new BigDecimal(1);
  25.                BigDecimal res = uno.subtract(dos);
  26.                System.out.println(res);
  27.                pw.println(res);
  28.                boolean primo = true;
  29.                if(op == 2)
  30.                {
  31.                    primo = true;
  32.                }
  33.                else
  34.                {
  35.                    if(op%2 == 0)
  36.                    {
  37.                        primo = false;
  38.                    }
  39.                    else
  40.                    {
  41.                        int x = 3;
  42.                        int raiz =(int)Math.sqrt(op);
  43.                        while(x <= raiz && op%x != 0)
  44.                        {
  45.                            x += 2;
  46.                        }
  47.  
  48.                        if(x > raiz)
  49.                        {
  50.                            primo = true;
  51.                        }
  52.                        else
  53.                        {
  54.                            primo = false;
  55.                        }
  56.                    }
  57.                }
  58.                if(primo == true)
  59.                {
  60.                    System.out.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
  61.                    pw.println(i+"==> El número "+res+" es primo de la secuencia de Mersenne "+tiempo.get(Calendar.HOUR)+":"+tiempo.get(Calendar.MINUTE)+":"+tiempo.get(Calendar.SECOND)+":"+tiempo.get(Calendar.MILLISECOND));
  62.                }
  63.        }
  64.        pw.close();
  65.        }
  66.        catch(FileNotFoundException e)
  67.        {
  68.            System.err.println("Problemas al abrir el fichero. "+e);
  69.        }
  70.    }
  71. }
  72.  

Como veras cuando calculo si el numero es primo o no utilizo condicionales "if(op == 2)", y si utilizo op en vez de opp(BigDecimal) el numero no es realmente el número que toca y el programa falla.
Es decir el numero 2^61 en double seria: 2.305843009213694E18 lo que realmente es 2305843009213693951 el cual es un número primo pero si entra como double no interpreta el número que realmente es y no lo toma como primo.
Por eso cuando se hace "if(op == 2)" necesito que op sea 2305843009213693951 y no 2.305843009213694E18.

Un poco lio no jajajjaa, esto no corre prisa ni es para nada es todo autodidacta y para aprender, si puedes o crees que se puede mejorar el código me encantaria discutirlo.
Gracias
En línea

lluvplay

Desconectado Desconectado

Mensajes: 27



Ver Perfil
Re: Representación de un número
« Respuesta #6 en: 6 Junio 2012, 16:48 pm »

He provado usando el op como double y no importa si estoy trabajando con 2.305843009213694E18  igual me debuelve que su residuo es 0 !!!

solo una observacion que en el for se manifiesta un i=2 incializado.
 si vemos el op= math.pow(2,i); eso seria minimo 4 entonces no comprendo el

if(op==2)

jejeje no se si me doy ha entender o estoy comprendiendo mal la secuencia de mersenne.
En línea

* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines