Recent Posts

Pages: [1] 2 3 ... 10
1
Java JSE / Re: rarezas del parseFloat y parseDouble
« Last post by chuidiang on Julio 18, 2018, 01:44:58 am »
Hola:

El problema es el siguiente. Un float son 4 bytes, un double son 8 bytes. En un número finito de bytes no puedes representar todos los valores decimales existentes, que son infinitos. Por ello, a partir de una determinada cifra, suelen haber "problemas" con las cifras que van detrás, "redondeos" extraños.

Con cuatro bytes, tienes números de 7 cifras significativas, a partir de la octava te pueden salir cosas raras. (fijate que tu 9 del final es justo la octava cifra). En un double (ocho bytes), son 15 cifras significativas, tendrías problemas a partir de la 16. Da igual que sean decimales o no, tendrías el mismo problema en la octava cifra de un float si es 0.123456789 como si es 123456789.

En la tabla en https://es.wikipedia.org/wiki/Coma_flotante#Formatos_de_coma_flotante tienes estos reflejado, fijate en la columna dígitos significativos en decimal.

Así que si necesitas más de 7 cifras de precisión, usa double. Y si necesitas más de las 15 que te da el double, tendrías que usar la clase BigDecimal de java.

Saludos.
2
Java JSE / rarezas del parseFloat y parseDouble
« Last post by sebotta on Julio 17, 2018, 11:44:17 pm »
Hola a todos, Estoy teniendo el siguiente problema, que no es menor, estoy teniendo diferencias de centavos en un sistema, cuando analizo el problema me encuentro que es debido a la conversión a Float hice la siguiente prueba que me dejo muy preocupado:

float a = Float.parseFloat("154721.49");
double b = Double.parseDouble("154721.49");

System.out.println(a);
System.out.println(b);

el resultado fue:

154721.48
154721.49

Aparentemente es un error aleatorio (antes no me había sucedido....creo!?)

Estas pruebas fueron realizadas en dos maquinas con SO Linux.

A alguien le había sucedido esto? Esto sucede solo en Float o tambien sucede en Double? Hay notas al respecto?

Desde ya muchas gracias!
3
Java: Librerías / Puñetitas con Hazelcast. Map de List
« Last post by chuidiang on Julio 08, 2018, 05:22:39 am »
Si hago esto

Code: [Select]
Map<String,List<Cosa>> map = hzInstance.getMap("myMap")
map.put("myKey", new ArrayList<Cosa>());
// Hasta aqui todo bien.

map.get("myKey").add(new Cosa());
//Pues no, resulta que map.get("myKey").size() es cero.

// Para que funcione bien hay que hacer esto
List<Cosa> cosas = map.get("myKey");
cosas.add(new Cosa());

// Y hay que añadir la lista entera para que se entere
map.put("myKey",cosas);

No sé si me convence, es fácil olvidarse de este detalle mientras se codifica....
4
Cursos y herramientas / Mejores prácticas para arquitectura microservicios
« Last post by chuidiang on Junio 30, 2018, 06:10:53 pm »
Un par de enlaces interesantes que me he encontrado

10 mejores prácticas
5 mejoras prácticas

¿Serán 15 en total?
5
Java: Librerías / EdisoncorSX
« Last post by Toño12 on Junio 08, 2018, 06:43:14 am »
Buenas tardes a todos:
Alguien sabe como puedo utilizar EdosoncorSX en eclipse. Ya lo añadí en la biblioteca de mi proyecto.
6
Lo de rehacer el array te refieres al de data[][], quitarle la ultima fila

public void deleteRow (int row) {
      //List<DTO> borrarDatos = new ArrayList<>();
      Object id = getValueAt(row, 0);
      System.out.println("id a borrar: " + (int)data[row][0]);
      daoPersona.borrarDatos((int)data[row][0]);
      System.out.println("fila " + row);
      System.out.println("Nº datos " + data.length);
      for (int i = row; i < data.length - 1  ; i++) {
         System.out.println("i " + i);

         data[0] = data[i+1][0];
         data[1] = data[i+1][1];
         data[2] = data[i+1][2];
         data[3] = data[i+1][3];
         data[4] = data[i+1][4];
         data[5] = data[i+1][5];
         data[6] = data[i+1][6];
      }
      fireTableDataChanged();
   }
   
7
Hola:

Después de borrar mueves todas las filas que hay detrás una fila antes. Pero no "mueves", sino que copias "machacando". La última fila sigue estando porque no la borras de ninguna manera, así que sigue estando.

O rehaces el array con una fila menos, o "marcas" de alguna manera la última como que tiene datos no válidos y no deben pintarse.

Saludos.
8
Hola buenas, llevo unos días con un problema un tanto extraño de resolver, la cuestión esta en el que yo tengo un botón de Borrado que me ejecuta dicho método pero el problema viene en la pintada que hace es decir cuando yo selecciono un registro del JTable y le doy a borrar me lo borra pero me duplica el ultimo registro.
Solo aparece en ese momento porque en la BD no aparece duplicado y si cierro y abro la interfaz ya no esta duplicado

1º foto metodo a implementar

2º foto donde al borrar Id 11 posteriormente me duplica el ultimo pero solo hay en la bd no aparece duplicado y si lo vuelvo a abrir tampoco

3 foto Controlador del botón

Por seguridad de los usuarios y privacidad aparecen tachados
9
Java JSE / Re: VALIDAR NÚMEROS DECIMALES
« Last post by chuidiang on Mayo 03, 2018, 07:14:42 pm »
Hola:

Una vez pones la variable "hayPunto" a true ... nunca más la vuelves a poner a false, por lo que las siguientes llamadas siempre darán que hayPunto.

Saludos.
10
Java JSE / VALIDAR NÚMEROS DECIMALES
« Last post by TONO2 on Mayo 03, 2018, 05:51:10 am »
Hola

Tengo un JDialog con un JTextField para ingresar números. Cuando pierde el foco del JtextField se acciona el public boolean esDecimal(String cad), para verificar si es un número decimal.

El problema que tengo es que la primera vez que valida, lo hace correcto ( por ejemplo con 3.14, dicen las variables, esDecimal o hayPunto que es true (correcto). Pero, sin cerrar el JDialog, marco 3 (no es decimal por carecer del punto y la parte decimal), las variables dicen lo mismo que es true, al igual que todas las siguientes. Es como si no regenerada las variables y tomara el dato del primer caso.

Aclaro que public boolean esDecimal(String cad), después llama a  public void RellenaDigitos(int cuantosEntera, int cuantosDecimal), para accionar los JOption y mostrar las variables.

Paro el programa es:

    String va10s = "";
    String cad = "";
    boolean hayPunto=false;
    int NDigitos = 0;
    int cuantosEntera = 0;
    int cuantosDecimal = 0;
    String enteros;
    String decimal;
    int posicionDelPunto=0;
    StringBuffer parteEntera;
    StringBuffer parteDecimal;
    String parteEnteras;
   

   
    public Prueba6(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        setLocationRelativeTo(null);
    }


    //Devuelve true si la cadena que llega tiene la sintaxis de un decimal
    public boolean esDecimal(String cad){
        NDigitos = 0;
        NDigitos = cad.length();
        //boolean hayPunto=false;
        StringBuffer parteEntera = new StringBuffer();
        StringBuffer parteDecimal = new StringBuffer();
        int i=0;
 
        for( i=0;i<cad.length(); i++ )                         // length.- Devuelve el nº de caracteres del String, expresado en int.
            if ( cad.charAt(i) == '.'){                          //Detectar si hay un punto decimal en la cadena
                hayPunto=true;
            }
            if(hayPunto){                                       //Si hay punto guardar la posición donde se encuentra el carácter punto
                posicionDelPunto=cad.indexOf('.');                 //(si la cadena tiene varios puntos, detecta donde esta el primero).
            }
            else{
                return false;                                      //Si no hay punto; no es decimal
            }
            if( posicionDelPunto == cad.length()-1 || posicionDelPunto== 0){    //Si el punto esta al final o al principio no es un decimal
                return false;
            }
        for( i=0;i<posicionDelPunto; i++ ){
            parteEntera.append(cad.charAt(i)) ;                 //Guardar la parte entera en una variable

        }

 
        for(i = 0; i<parteEntera.length(); i++)
            if( ! Character.isDigit(parteEntera.charAt(i)) ){    //Si alguno de los caracteres de la parte entera no son digitos no es decimal
                return false;
            }
        for( i=posicionDelPunto+1;i<cad.length(); i++ )
            parteDecimal.append(cad.charAt(i));                 //Guardar la parte decimal en una variable
       
       
 
        for(i = 0; i<parteDecimal.length(); i++)
            if( ! Character.isDigit(parteDecimal.charAt(i))){   //Si alguno de los caracteres de la parte decimal no es un digito no es decimal
                return false;                                       //Incluye el caso en el que la cadena tenga dos o mas puntos
            }
        cuantosEntera = parteEntera.length();
        cuantosDecimal = parteDecimal.length();

        return true;                                        //Si paso todas las pruebas anteriores, la cadena es un Numero decimal
   
   
    }
 


    public void RellenaDigitos(int cuantosEntera, int cuantosDecimal){
        //Aqui se muestran los datos de las variables
        JOptionPane.showMessageDialog(null, "Es decimal: "+esDecimal(cad));
        JOptionPane.showMessageDialog(null, "El dato de hay punto es: "+hayPunto);
        JOptionPane.showMessageDialog(null, "La cantidad de dígitos de cad es: "+NDigitos);
         JOptionPane.showMessageDialog(null, "La cantidad de dígitos de la parte entera es: "+cuantosEntera);
        JOptionPane.showMessageDialog(null, "La cantidad de digitos de la parte decimal es: "+cuantosDecimal);
        JOptionPane.showMessageDialog(null, "El dato de la posición del punto es: "+posicionDelPunto);
        JOptionPane.showMessageDialog(null, "El dato de va10s es :"+va10s);
       
       
        //Si marcamos 3.14 y sin cerrar la pantalla marcamos 3. En el primer caso asigna true (es decimal) y en el segundo (deberia de marcar false, por faltar
        // el punto de separación y la parte decimal) y sucesivos tambien los marca, true. Es como si no analizara el nuevo dato.
       
 
    }


Y en el evento de la perdida del foco:

        // Devuelve true en case de ser un numero decimal
        va10s = txtNDecimal.getText();
        cad = va10s;
        esDecimal(cad);
        RellenaDigitos(cuantosEntera, cuantosDecimal);
        cad = "";


Pages: [1] 2 3 ... 10
ey