2011-03-04 12 views
181

Necesito formatear un flotante en "n" lugares decimales.Formato Float hasta n decimales

estaba tratando de BigDecimal, pero el valor de retorno no es correcto ...

public static float Redondear(float pNumero, int pCantidadDecimales) { 
    // the function is call with the values Redondear(625.3f, 2) 
    BigDecimal value = new BigDecimal(pNumero); 
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30) 
    return value.floatValue(); // but here the values is 625.3 
} 

necesito devolver un valor flotante con el número de cifras decimales que especifique.

necesito Float valor de retorno no Double

.

Respuesta

499

También puede pasar el valor de coma flotante, y utilizar:

String.format("%.2f", floatValue);

Documentation

+58

Tenga en cuenta que como String.format depende de su configuración local actual, es posible que no obtenga un punto como separador. Prefiero usar 'String.format (java.util.Locale.US,"%. 2f ", floatValue);' – Gomino

+5

esta respuesta da un valor String, no un valor Float, no creo que sea una buena respuesta. – ZhaoGang

+1

¿Por qué deberías forzar un punto como separador? –

36

Eche un vistazo a DecimalFormat. Puede usarlo fácilmente para tomar un número y darle un número de decimales.

Edición: Example

+1

+1. Aquí está la [documentación específica de Android] (http://developer.android.com/reference/java/text/DecimalFormat.html), que debería ser esencialmente la misma. –

+0

pero necesito el resultado es un número flotante, no una cadena. – seba123neo

+0

¿Estás diciendo que quieres redondear el flotador? Normalmente, la única precisión de tiempo de un flotador es para mostrar. –

1

creo que lo que quiere ist

return value.toString(); 

y utiliza el valor de retorno para mostrar.

value.floatValue(); 

siempre devolverá 625.3 porque se usa principalmente para calcular algo.

+0

pero necesito el resultado es un número flotante, no una cadena. – seba123neo

+1

si necesita un flotador para mostrárselo al usuario, puede haber algún problema con el diseño de la aplicación. Por lo general, el flotador se usa para calcular y se usa una cuerda para mostrárselo al usuario. – n3utrino

+0

lo siento, tiene razón, estaba confundido, simplemente formatee el número cuando se muestra en la pantalla, no antes, esa fue mi pregunta, muchas gracias, problema resuelto. – seba123neo

14

probar este esto me ayudó mucho

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP); 

resultado será roundfinalPrice - > 5652.26

+2

Esto es más útil para aquellos que buscan redondear y hacer algunos cálculos adicionales con él, de lo contrario, la respuesta de Arve es probablemente la mejor. – Gerard

+0

funcionó perfectamente para mí. – ZhaoGang

4

Un poco sorprendido, nadie ha señalado la forma directa de hacerlo, lo cual es bastante fácil.

double roundToDecimalPlaces(double value, int decimalPlaces) 
{ 
     double shift = Math.pow(10,decimalPlaces); 
     return Math.round(value*shift)/shift; 
} 

Bastante sure que esto no hace ni siquiera medio redondeo.

Por lo que vale, el redondeo a medias incluso será caótico e impredecible cada vez que mezcle valores de coma flotante basados ​​en binario con aritmética de base 10. Estoy bastante seguro de que no se puede hacer. El problema básico es que un valor como 1.105 no se puede representar exactamente en coma flotante. El valor del punto flotante va a ser algo así como 1.105000000000001 o 1.104999999999999. Por lo tanto, cualquier intento de realizar un redondeo a la mitad o incluso par va a generar errores de codificación de representación.

Las implementaciones de punto flotante IEEE harán el medio redondeo, pero hacen el medio redondeo binario, no el medio redondeo decimal. Así que es probable que estés bien

+0

También he usado este método por un tiempo, pero creo que 'pow' es una operación demasiado costosa para usar en el redondeo. – Xerus

+0

Nunca optimice hasta que tenga un problema de rendimiento. Más importante es estar en lo cierto que rápido. Y no puedo imaginar honestamente una aplicación donde la ejecución del redondeo controlado sea un problema, a menos que usted sea Visa o Mastercard (que simplemente lanzaría más máquinas). Y pow() es probablemente más rápido que round(). –

1
public static double roundToDouble(float d, int decimalPlace) { 
     BigDecimal bd = new BigDecimal(Float.toString(d)); 
     bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); 
     return bd.doubleValue(); 
    } 
3

Aquí hay una muestra rápida utilizando la clase DecimalFormat mencionado por Nick.

float f = 12.345f; 
DecimalFormat df = new DecimalFormat("#.00"); 
System.out.println(df.format(f)); 

La salida de la instrucción print habrá 12.35. Tenga en cuenta que lo redondeará por usted.

+0

De nota, el uso del constructor 'DecimalFormat' no se recomienda, vea mi respuesta para un uso correcto de' NumberFormat'. – FBB

10

De nota, el uso del constructor DecimalFormat no se recomienda. El javadoc para esta clase declara:

En general, no llame a los constructores DecimalFormat directamente, ya que los métodos de fábrica NumberFormat pueden volver subclases distintas de DecimalFormat.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Así que lo que hay que hacer es (por ejemplo):

NumberFormat formatter = NumberFormat.getInstance(Locale.US); 
formatter.setMaximumFractionDigits(2); 
formatter.setMinimumFractionDigits(2); 
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue)); 
2

Esta es una manera mucho menos profesional y mucho más caro, pero debería ser más fácil de entender y más útil para principiantes.

public static float roundFloat(float F, int roundTo){ 

    String num = "#########."; 

    for (int count = 0; count < roundTo; count++){ 
     num += "0"; 
    } 

    DecimalFormat df = new DecimalFormat(num); 

    df.setRoundingMode(RoundingMode.HALF_UP); 

    String S = df.format(F); 
    F = Float.parseFloat(S); 

    return F; 
} 
Cuestiones relacionadas