uqe opinan de estos comentarios.

Checando el face me encontre con esto, que opinan?

Haber YABAÑEROS ejecuten esta JSP y lloren:

<%
double uno = 0.01;
double suma = 0.000;
for (int i=1; i<50; i++) {
%>

La suma de 0.01 (49 veces) deberia dar: 0.49. Pero JAVA NO SABE SUMAR:

<% suma = suma + uno;%>
<%= i %>) <%= suma %> + <%= uno %> = <%= suma %><br />
<% } %>

La suma total, segun Java es de 0.49000000000000027
jaja... 0.49000000000000027
XD... hay no en serio... LOL
0.49000000000000027....?
Moraleja: JAVA NO SABE SUMAR DECIMALES

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

así es

Cualquier programador Java con experiencia sabe perfectamente que no se debe usar double (ni float) esperando resultados exactos.

Esto ya ha sido discutido aquí mismo.

Yo opinio que: "Bienvenido a

Yo opinio que: "Bienvenido a Java"

Yeap, la razón es que el tipo de dato double intenta guardar una cantidad infitia de "decimales" en un espacio finito de posiciones ( el double es de 64 bits y no le caben más ).

Todos las operaciones hechas con estos números tienen ese problema y no es privativo de Java.

Si se necesita un resultado exacto es mejor usar BigDecimal

import java.math.BigDecimal;
class BigDecimalTest {
  public static void main( String ... args ) {
    BigDecimal uno = new BigDecimal( "0.01" );
    BigDecimal suma = new BigDecimal( "0.000"  );
    for( int i = 1 ; i < 50 ; i++) {
      suma = suma.add( uno );
    }
    System.out.println( suma );
  }
}

Resultado:

$ java BigDecimalTest
0.49

p.d. No es necesario que ejecutes tu código en un JSP, puedes hacerlo también en archivos de texto plano usando la terminación ".java"

Para entender más sobre este comportamiento lee también: http://blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal

Imagen de Sr. Negativo

BigDecimal

Nunca me había dado cuenta en que existía esta librería, siempre había usado Math.round(), bueno nunca es tarde para aprender asi que aqui un ejemplo sencillo de como usarlo

/**
*@author Yo
*
*/

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.io.*;

public class  Jp35{
       
       
        public static void main (String[] args)throws IOException,Exception {
               
                BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in));
               
                //nota: se tiene que declarar como String
                BigDecimal num1= new BigDecimal("0.9823");
                num1 =num1.setScale(2, RoundingMode.HALF_UP);
                System.out.println("Cifra 0.9823  redondeada es: "+num1);
               
                //introduciendo datos
                System.out.println("Introduce un número:");
                String num2=teclado.readLine();
                System.out.println("Cifra "+num2);
                BigDecimal bgnum2=new BigDecimal(num2);
                bgnum2=bgnum2.setScale(2, RoundingMode.HALF_UP);
                System.out.println("redondeada es: "+bgnum2);
               
               
               
               
                System.exit(0);
        }//fin main
       
}//fin case Jp35

Bueno miren

Que interesante, también sucede lo mismo con la división, aunque aquí si funciona cuando pasa el valor directo.

Seria bueno, ir poniendo estos casos en un apartado, al menos que exista me disculpo ejej.

Con lo de la suma si multiplicas 0.01 * 49 si da el valor que buscas, suma = 0.01d*49;

bueno miren:

public class Division{
       
                public Division(){
                       
                        double resultado=0;
                       
                        double variable1=25,
                                   variable2=90;
                       
                        //Con variables
                        resultado = variable1/variable2;
                        System.out.println("Con variables: "+resultado);
                        //valor directo
                        resultado = 25d/100d;
                        System.out.println("Directo: "+resultado);
                       
                        }
       
                public static void main(String irv[]){
                        Division nueva = new Division();
                        }
        }
Imagen de greeneyed

La ignorancia es atrevida

Yo simplemente diría que extrañarse de eso simplemente demuestra ignorancia de como se almacenan y funcionan los numeros de punto flotante en muchos lenguajes, donde se escoje por defecto el rendimiento sobre la precisión infinita y el programador ha de escoger si quiere lo segundo.

Vease PHP: http://php.net/manual/es/language.types.float.php
Vease C: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
...

Aparte de eso, lo otro único que se me ocurriría responder es "don't feed the trolls, they bite!" :)

de hecho ese comentario de

de hecho ese comentario de que "java no sabe sumar decimales", es de una persona que se empeña en comparar

PHP

con

JAVA

, dice que es mejor por que lo que haces en java en 20 lineas en php lo puedes hacer en 15.
Igual compara mucho JavaMicroEdition con flash builder. Practicamente es una persona que no le ve nada bueno a java.

Imagen de ingscjoshua

mmmm y?

Hola pues claro que cualquier programador Java cuerdo sabe que la presicion esta en BigDecimal, por otra parte si java no sabe sumar porq lo usan en los bancos??, a caso eso no lo habrian notado ya desde hace años y lo habrian sacado de ahi????, pero en fin como dicen demuestran ignorancia del uso del lenguaje!!!!!!!!!!

Imagen de beto.bateria

Un consejo, no te pongas a

Un consejo, no te pongas a discutir con el, no vas a llegar a nada. Es una persona ignorante.

Imagen de luxspes

Moraleja: Investiga

Checando el face me encontre con esto, que opinan?


Been there, done that

Moraleja: JAVA NO SABE SUMAR DECIMALES

Verdedera moraleja: Hay muchas maneras de sumar decimales. Puedes hacerlo en base 2, o en base 10.

Imagen de luxspes

Ignorancia doble: PHP tampoco "sabe sumar"

de hecho ese comentario de que "java no sabe sumar decimales", es de una persona que se empeña en comparar
PHP
con
JAVA

Pues entonces no solo es ignorante en cuanto a Java, tambien es ignorante en cuanto a PHP

De la documentacion de PHP:

Additionally, rational numbers that are exactly representable as floating point numbers in base 10, like 0.1 or 0.7, do not have an exact representation as floating point numbers in base 2, which is used internally, no matter the size of the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9999999999999991118....

Y ser ignorante no es malo...

Y ser ignorante no es malo... es decir, nadie nace sabiendo todo y en algún punto todos vamos a desconocer algo, lo malo es ser necio e insistir en la ignorancia:

Preguntar: "¿Por que 0.1 + 01 + etc. edtc me da 0.020000000009911 y no 0.03?" es una pregunta legítima, a esta pregunta no debemos de contestar "Ahh pues que bruto eres, blah blah blah, pero si la pregunta ya no es pregunta sino un comentario basado en la ignorancia de Jo jo java es un lenguaje que no sirve porque.... pues entonces si , como dice Greeneyed no le den de comer más al troll.

:)