java - limitar - Formato Flotante a n lugares decimales
limitar decimales en java netbeans (10)
Necesito formatear un flotador a "n" lugares decimales.
estaba intentando 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 lugares decimales que especifique.
Necesito retorno de valor Float
no Double
.
¡Estaba buscando una respuesta a esta pregunta y luego desarrollé un método! :) Una advertencia justa, está redondeando el valor.
private float limitDigits(float number) {
return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
Aquí hay una muestra rápida usando la clase DecimalFormat
mencionada por Nick.
float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));
La salida de la declaración de impresión será 12.35. Observe que lo redondeará para usted.
Creo que lo que quieres es
return value.toString();
y use el valor de retorno para mostrar.
value.floatValue();
Siempre devolverá 625.3 porque se usa principalmente para calcular algo.
Echa un vistazo a DecimalFormat . Puede usarlo fácilmente para tomar un número y asignarle un número determinado de lugares decimales.
Editar : Example
Es de destacar que se desaconseja el uso del constructor DecimalFormat
. El javadoc para esta clase establece:
En general, no llame directamente a los constructores de DecimalFormat, ya que los métodos de fábrica de NumberFormat pueden devolver subclases distintas a DecimalFormat.
https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html
Entonces, lo que debes 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));
Esta es una forma mucho menos profesional y mucho más costosa, pero debería ser más fácil de entender y más útil para los 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;
}
Intenta esto, esto me ayudó mucho.
BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);
El resultado será roundfinalPrice -> 5652.26
Un poco sorprendido de que nadie haya 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 seguro de que esto no hace redondeo a medias incluso sin embargo.
Para lo que vale, el redondeo a medias es caótico e impredecible cada vez que mezcle valores de punto flotante basados en binarios 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 punto flotante. El valor del punto flotante será algo así como 1.105000000000001 o 1.104999999999999. Por lo tanto, cualquier intento de realizar un redondeo a medias es un error de codificación representacional.
Las implementaciones de punto flotante de IEEE harán el redondeo a medias, pero lo hacen al redondeo binario, no al redondeo decimal. Entonces probablemente estas bien
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();
}