web-dev-qa-db-fra.com

Comment puis-je tronquer un double à seulement deux décimales en Java?

Par exemple, j'ai la variable 3.545555555, que je voudrais tronquer à 3,54. 

66
Johnny

Si vous voulez cela pour l'affichage, utilisez Java.text.DecimalFormat :

 new DecimalFormat("#.##").format(dblVar);

Si vous en avez besoin pour les calculs, utilisez Java.lang.Math :

 Math.floor(value * 100) / 100;
112
Bozho
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

Vérifier les disponibilités RoundingMode et DecimalFormat .

39
Cedric Dubourg

Bit Old Forum, Aucune des réponses ci-dessus n'a fonctionné à la fois pour les valeurs positives et négatives (je veux dire pour le calcul et juste pour tronquer sans arrondir) . Du Comment arrondir un nombre à n décimales en Java lien 

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);
    }
}

Cette méthode a bien fonctionné pour moi.

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));

Résultats :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
14
Mani

Notez tout d'abord qu'une double est une fraction binaire et n'a pas vraiment n'a décimales.

Si vous avez besoin de décimales, utilisez une BigDecimal, qui possède une méthode setScale() pour la troncature, ou utilisez DecimalFormat pour obtenir une String.

7
Michael Borgwardt

Si, pour une raison quelconque, vous ne souhaitez pas utiliser un BigDecimal, vous pouvez convertir votre double en un int pour le tronquer. 

Si vous voulez tronquer les Ones place:

  • jette simplement sur int

Au Dixièmes lieu:

  • multiplier par dix
  • casting à int
  • rejouer à double
  • et diviser par dix.

Hundreths lieu

  • multiplier et diviser par 100 etc.

Exemple:

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;
}

Dans cet exemple, decimalPlaces serait le nombre de places ANCIENNES de l'endroit où vous souhaitez aller, donc 1 arrondirait au dixièmes lieu, 2 au centièmes , etc. uns place, et un négatif aux dizaines, etc.)

5
Tarvis

Peut-être que Math.floor(value * 100) / 100? Attention, les valeurs telles que 3.54 peuvent ne pas être exactement représentées par un double.

4
Vlad

Vous pouvez utiliser l'objet de classe NumberFormat pour accomplir la tâche.

// 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
3
Rushdi Shams

Voici la méthode que j'utilise:

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

Cela peut aussi être fait:

a=Math.floor(a*100) / 100;
2
Mitchell Hynes

3.545555555 pour obtenir 3,54 . Essayez de suivre pour cela:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

Cela donnera = 3,54!

2
Ankush G

Formater en tant que chaîne et reconvertir en double, je pense, vous donnera le résultat souhaité.

La valeur double ne sera pas arrondie (), étage () ou ceil ().

Une solution rapide pour cela pourrait être:

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

Vous pouvez utiliser la valeur sValue à des fins d'affichage ou la valeur newValue pour le calcul.

2
Jao Assy
//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

eh bien, cela pourrait être un peu gênant, mais je pense que cela peut résoudre votre problème :)

0
user5251903

Peut-être après:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  
0
Ritesh

Une vérification rapide consiste à utiliser la méthode Math.floor. J'ai créé une méthode pour vérifier un double pour deux décimales ou moins ci-dessous:

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;
}
0
chris31389