2011-05-12 12 views
6

En mi aplicación quiero redondear un doble a 2 cifras significativas después del punto decimal. Probé el código a continuación.formato de número de Android

public static double round(double value, int places) { 
long factor = (long) Math.pow(10, places); 
value = value * factor; 
long tmp = Math.round(value); 
return (double) tmp/factor; 
} 

También probé

double val = ....; 
val = val*100; 
val = (double)((int) val); 
val = val /100; 

tanto el código no funciona para mí.

Gracias de antemano ....

+0

¿Puede dar un ejemplo de incorrectos de entrada/salida? –

+0

cuando doy la entrada 0.5, devuelve 0.5. Realmente necesito 0,50 como salida. También cuando doy entrada 2.0 necesito una salida 2.00. – upv

+2

El número 0.5 es indistinguible de 0.50, su problema no es el código de redondeo, sino el código que muestra el número. –

Respuesta

19

Como dijo Grammin, si intentas representar dinero, usa BigDecimal. Esa clase tiene soporte para todo tipo de redondeo, y puede establecer exactamente la precisión deseada.

Pero para responder directamente a su pregunta, no puede establecer la precisión en un doble porque es un punto flotante. No es tiene una precisión. Si solo necesita hacer esto para formatear la salida, le recomendaría usar un NumberFormat. Algo como esto:

NumberFormat nf = NumberFormat.getInstance(); 
nf.setMinimumFractionDigits(2); 
nf.setMaximumFractionDigits(2); 
String output = nf.format(val); 
2

Yo recomiendo usar BigDecimal si usted está tratando de representar la moneda.

Esto example puede ser útil.

+0

También probé el código a continuación. doble ronda pública estática (doble sin redondear) { BigDecimal bd = new BigDecimal (sin redondear); BigDecimal rounded = bd.setScale (2, BigDecimal.ROUND_HALF_UP); return rounded.doubleValue(); } – upv

0

Como programa- sugirió que podría utilizar BigDecimals para que, o Tobe NumberFormat seguro sobre el número de cifras que se muestran

0

Su código parece funcionar para mí

double rounded = round(0.123456789, 3); 
System.out.println(rounded); 

>0.123 

Editar: acaba de ver su comentario sobre el tu pregunta. Este es un problema de formateo, no un problema matemático.