Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ayuda sobre cifras significativas (decimales !=0)

Necesito saber como puedo modificar la cantidad de cifras significativas en java, por ejemplo, la division de 3/10 da 0.33333 (periodico), quiero saber como puedo decirle a mi clase que me muestre un 'n' numero de decimales. Realmente es para el codigo de una calculadora que haga raices cuadradas, dejo el modulo de la raiz:


import java.util.Scanner;
public class Calculadora {
public static void main(String[] args)
throws java.io.IOException {
Scanner scnrLeer = new Scanner (System.in);
float flOperando1, flOperando2, flResultado = 1;
char chInciso;
do
{
System.out.println ("Esta es una calculadora en consola, en seguida se muestran las opciones"
+ " disponibles...");
System.out.println("6. Raiz Cuadrada");
do
{
chInciso = (char) System.in.read();
} while (chInciso == '\n' | chInciso == '\r');
} while (chInciso < '1' | chInciso > '7');
System.out.println("\n");
switch (chInciso)
case '6':
System.out.println ("Eligio una raiz cuadrada");
System.out.print ("Ingrese el numero: ");
flOperando1 = scnrLeer.nextInt();
flResultado = (float) Math.sqrt (flOperando1);
System.out.print("Raiz de " + flOperando1 + " = " + flResultado);
break;
}
}
}

He buscado en muchos lugares y no he conseguido algo que pueda entender bien :/

diciembre 3, 2013 | Registered Commenterazureus

http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

diciembre 3, 2013 | Registered Commenterchoces

Saludos.
Según la bibliografía que te sugirió choces te pongo tu código modificado. Ten en cuenta que en los comentatarios te digo que ya puse el numero de cifra decimales fijo en 3 pero ya eso tú lo varías según te convenga, al igual que el patrón está fijo a una cifra decimal como mínimo pero ya eso verás como te conviene. Por lo menos la idea de lo que buscas está ahí.
import java.util.Scanner;
import java.text.DecimalFormat;
public class Calculadora {
public static void main(String[] args)
throws java.io.IOException {
Scanner scnrLeer = new Scanner (System.in);
float flOperando1, flOperando2, flResultado = 1;
char chInciso;
do
{
System.out.println ("Esta es una calculadora en consola, en seguida se muestran las opciones"
+ " disponibles...");
System.out.println("6. Raiz Cuadrada");
do
{
chInciso = (char) System.in.read();
} while (chInciso == '\n' | chInciso == '\r');
} while (chInciso < '1' | chInciso > '7');
System.out.println("\n");
switch (chInciso)
{
case '6':
System.out.println ("Eligio una raiz cuadrada");
System.out.print ("Ingrese el numero: ");
flOperando1 = scnrLeer.nextInt();
String pattern="###.#";
//Aquí comienza el código para crear el patron del formato a partir de un n números de decimales, en este ejemplo el patrón siempre va a tener
//como mínimo una cifra decimal y n est'a establecido en 3;
int n = 3;
if(n>1)
{
for(int i = 0; i<n-1; i++)
{
pattern += "#";
}
}
//Ya una vez creado el patrón se hace el cálculo con el formato deseado
DecimalFormat myFormatter = new DecimalFormat(pattern);
flResultado = (float) Math.sqrt (flOperando1);
String resultadoFormateado = myFormatter.format(flResultado);
System.out.print("Raiz de " + flOperando1 + " = " + resultadoFormateado);
break;
}
}
}

diciembre 5, 2013 | Unregistered Commenteryord

Pordiras usar la clase BigDecimal ..

primero declaras e instancias

Bigdecimal valorPresision = new BigDecimal(valorDouble);
valorPresision.setScale(2,BigDecimal.ROUND_HALF_UP);
//la linea anterior te redondea a dos decimales si quisieras mas decimales
//cambia el 2 por el num de decimales.
//luego puesde recuperar el valor asi:

System.out.println (valorPresision.doubleValue());

______________
Espero te sirva

diciembre 5, 2013 | Unregistered CommenterDavid

BigDecimal es muy "pesado". Solo debe usarse cuando no hay otro remedio.

diciembre 6, 2013 | Registered Commenterchoces

Exacto. BigDecimal es util solo para casos concretos en los que necesitamos trabajar con una gran precision en los calculos que Double no nos puede aportar (aplicaciones financieras, o en la NASA, por ejemplo).
Pero usarlo simplemente para redondear un numero es un poco matar moscas a canonazos.

https://blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal

Un saludo

diciembre 6, 2013 | Unregistered CommenterUnoPorAhi

Guenas.

Este comentario solo viene de refilon al tema.

Estoy harto de los problemas de precisión que tengo con java. Cualquier operación con euros y centimos de euro que trato tengo que manejarlas con int.

Siempre tengo que convertir doubles y floats a int multiplicando por 100 y acabar la operacion dividiendo por 100 para obtener resultados correctos. Cuando hay alguna multiplicacion o division en la que intervengan numeros en coma flotante fallan aunque su division sea exacta a N decimales.

Entiendo el problema de los numeros en coma flotante, pero las mismas operaciones realizadas en cobol, basic, pl1, plsql, screencobol, etc me devuelven resultados correctos. ¿Porque con java no? El problema de la coma flotante es idéntico en todos ellos ya que a bajo nivel se manejan igual.
Seguro que hago algo mal, pero aun no he entendido el problema de base y sigo teniendo que hacer pegotes para subsanar problemas que creo que no deberían existir.

Un saludo

diciembre 8, 2013 | Unregistered CommenterPaposo

Unos enlaces útiles sobre el asunto de monedas y Java.

http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency

http://stackoverflow.com/questions/1359817/using-bigdecimal-to-work-with-currencies

https://java.net/projects/javamoney/pages/Precision

http://java.dzone.com/articles/working-money-java

http://www.javapractices.com/topic/TopicAction.do?Id=13

http://crackingjavainterviews.blogspot.com.es/2013/04/best-way-for-storing-currency-values-in.html

http://tim.fanel.li/2012/09/bigdecimal-roundingmode-and-currency-values-in-java/

diciembre 8, 2013 | Registered Commenterchoces