redondear - ¿Cómo puedo truncar un doble a solo dos lugares decimales en Java?
math.round java dos decimales (15)
3.545555555 para obtener 3.54. Intente seguir por esto:
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);
double result = new Double(df.format(3.545555555);
¡Esto dará = 3.54!
Esta pregunta ya tiene una respuesta aquí:
- Cómo redondear un número a n decimales en Java 29 respuestas
Por ejemplo, tengo la variable 3.545555555, que me gustaría truncar a solo 3.54.
Bit Old Forum, ninguna de las respuestas anteriores funcionó tanto para valores positivos como negativos (quiero decir para el cálculo y solo para truncar sin redondeo). Desde Cómo redondear un número hasta n lugares decimales en el enlace de Java
private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
if ( x > 0) {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
} else {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
}
}
Este método funcionó bien para mí.
System.out.println(truncateDecimal(0, 2));
System.out.println(truncateDecimal(9.62, 2));
System.out.println(truncateDecimal(9.621, 2));
System.out.println(truncateDecimal(9.629, 2));
System.out.println(truncateDecimal(9.625, 2));
System.out.println(truncateDecimal(9.999, 2));
System.out.println(truncateDecimal(-9.999, 2));
System.out.println(truncateDecimal(-9.0, 2));
Resultados:
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Este es el método que uso:
double a=3.545555555; // just assigning your decimal to a variable
a=a*100; // this sets a to 354.555555
a=Math.floor(a); // this sets a to 354
a=a/100; // this sets a to 3.54 and thus removing all your 5''s
Esto también se puede hacer:
a=Math.floor(a*100) / 100;
Esto funcionó para mí:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Personalmente me gusta esta versión porque en realidad realiza el redondeo numéricamente, en lugar de convertirlo en una cadena (o similar) y luego formatearlo.
Formatear como una cadena y convertir de nuevo a doble, creo que le dará el resultado que desea.
El valor doble no será round (), floor () o ceil ().
Una solución rápida podría ser:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Puede usar sValue para fines de visualización o el nuevo valor para el cálculo.
Note primero que un double
es una fracción binaria y realmente no tiene decimales.
Si necesita lugares decimales, use un BigDecimal
, que tiene un método setScale()
para truncamiento, o use DecimalFormat
para obtener un String
.
Puede usar el objeto de la clase NumberFormat para realizar la tarea.
// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
nf.setGroupingUsed(false);
System.out.println(nf.format(precision));// Assuming precision is a double type variable
Quizás siguiendo:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Si, por algún motivo, no desea utilizar un BigDecimal
, puede convertir su double
en un int
para truncarlo.
Si quieres truncar al lugar de Uno :
- simplemente lanzar a
int
Al décimo lugar:
- multiplicar por diez
- emitir a
int
- devolver al
double
- y divide por diez.
Lugar Cientos
- multiplicar y dividir por 100, etc.
Ejemplo:
static double truncateTo( double unroundedNumber, int decimalPlaces ){
int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
return truncatedNumber;
}
En este ejemplo, decimalPlaces
sería el número de lugares PASADOS en el lugar donde desea ir, por lo que 1 redondeará al décimo lugar, 2 a centésimas , y así sucesivamente (0 rondas al lugar de las unidades, y negativo al decenas, etc.)
Tal vez Math.floor(value * 100) / 100
? Tenga en cuenta que los valores como 3.54
pueden no estar representados exactamente con un double
.
Tengo una versión ligeramente modificada de Mani .
private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}
public static void main(String[] args) {
System.out.println(truncateDecimal(0, 2));
System.out.println(truncateDecimal(9.62, 2));
System.out.println(truncateDecimal(9.621, 2));
System.out.println(truncateDecimal(9.629, 2));
System.out.println(truncateDecimal(9.625, 2));
System.out.println(truncateDecimal(9.999, 2));
System.out.println(truncateDecimal(3.545555555, 2));
System.out.println(truncateDecimal(9.0, 2));
System.out.println(truncateDecimal(-9.62, 2));
System.out.println(truncateDecimal(-9.621, 2));
System.out.println(truncateDecimal(-9.629, 2));
System.out.println(truncateDecimal(-9.625, 2));
System.out.println(truncateDecimal(-9.999, 2));
System.out.println(truncateDecimal(-9.0, 2));
System.out.println(truncateDecimal(-3.545555555, 2));
}
Salida:
0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54
Una comprobación rápida es usar el método Math.floor. Creé un método para verificar un doble para dos o menos decimales a continuación:
public boolean checkTwoDecimalPlaces(double valueToCheck) {
// Get two decimal value of input valueToCheck
double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;
// Return true if the twoDecimalValue is the same as valueToCheck else return false
return twoDecimalValue == valueToCheck;
}
Si lo desea para fines de visualización, use java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Si lo necesita para cálculos, use java.lang.Math
:
Math.floor(value * 100) / 100;
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf(''.'');//we find the position of ''.''
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result
Bueno, esto podría ser un poco incómodo, pero creo que puede resolver su problema :)
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Compruebe RoundingMode
y DecimalFormat
disponibles.