Por exemplo, tenho a variável 3.545555555, que gostaria de truncar para apenas 3,54.
Por exemplo, tenho a variável 3.545555555, que gostaria de truncar para apenas 3,54.
Respostas:
Se você quiser isso para fins de exibição, use java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Se você precisar dele para cálculos, use java.lang.Math
:
Math.floor(value * 100) / 100;
floor
para truncar funciona apenas para valores positivos.
RoundingMode.DOWN
como RoudingMode.FLOOR
sempre, em volta do infinito negativo.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Verifique disponíveis RoundingMode
e DecimalFormat
.
DOWN
isso realmente tem o efeito de truncamento para números positivos e negativos. Conforme visto na tabela de exemplos do documento .
Fórum pouco antigo, nenhuma das respostas acima funcionou para valores positivos e negativos (quero dizer para o cálculo e apenas para fazer truncar sem arredondamento). Do link Como arredondar um número para n casas decimais em 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 funcionou bem para mim.
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
Observe primeiro que a double
é uma fração binária e realmente não tem casas decimais.
Se precisar de casas decimais, use a BigDecimal
, que tem um setScale()
método para truncamento, ou use DecimalFormat
para obter a String
.
Se, por qualquer motivo, você não quiser usar um, BigDecimal
pode transmitir seu double
para umint
para truncá-lo.
Se você deseja truncar o Ones lugar:
int
Para o lugar Décimo :
int
double
centésimos lugar
Exemplo:
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;
}
Neste exemplo, decimalPlaces
seria o número de casas APÓS as unidades que você deseja ir, então 1 arredondaria para a décima casa , 2 para as centésimas , e assim por diante (0 arredondaria para a casa das unidades e um negativo para as dezenas , etc.)
unroundedNumber
forem grandes o suficiente. Pode funcionar para o exemplo em questão, mas uma solução geral deve funcionar para qualquer um double
.
A formatação como uma string e a conversão de volta para o dobro, acho que lhe dará o resultado desejado.
O valor duplo não será redondo (), piso () ou teto ().
Uma solução rápida para isso poderia ser:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Você pode usar o sValue para fins de exibição ou o newValue para cálculos.
Você pode usar o objeto NumberFormat Class para realizar a tarefa.
// 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
Aqui está o 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
Isso também pode ser feito:
a=Math.floor(a*100) / 100;
Talvez seguindo:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Uma verificação rápida é usar o método Math.floor. Criei um método para verificar duas vezes ou menos casas decimais abaixo:
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;
}
Eu tenho uma versão ligeiramente modificada do 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));
}
Resultado:
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
Isso funcionou para mim:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Eu pessoalmente gosto desta versão porque ela realmente executa o arredondamento numericamente, ao invés de convertê-la em uma String (ou similar) e então formatá-la.
//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
bem, isso pode ser um pouco estranho, mas acho que pode resolver o seu problema :)