Comment tronquer un double à deux décimales en Java? [dupliquer]

cette question a déjà une réponse ici:

par exemple, j'ai la variable 3.545555555, que je voudrais tronquer à seulement 3.54.

62
demandé sur Johnny 2011-10-13 02:46:26

15 réponses

si vous souhaitez que pour les besoins de l'Affichage, utiliser java.text.DecimalFormat :

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

si vous en avez besoin pour les calculs, utilisez java.lang.Math :

 Math.floor(value * 100) / 100;
105
répondu Bozho 2017-05-19 17:20:41
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

contrôle disponible RoundingMode et DecimalFormat .

36
répondu Cedric Dubourg 2015-04-14 19:55:36

Forum un peu vieux, aucune de la réponse ci-dessus travaillé pour les valeurs positives et négatives ( je veux dire pour le calcul et juste de faire tronquer sans arrondi). Du comment arrondir un nombre à n décimales en Java link

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
répondu Mani 2017-05-23 12:34:37

notez tout d'abord qu'une double est une fraction binaire et ne fait pas vraiment ont décimales.

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

7
répondu Michael Borgwardt 2011-10-12 22:52:20

si, pour une raison quelconque, vous ne voulez pas utiliser un BigDecimal vous pouvez lancer votre double dans un int pour la tronquer.

si vous voulez tronquer à la uns place:

  • simplement moulé à int

à la dixièmes lieu:

  • multiplier par dix
  • int
  • acteurs double
  • et diviser par dix.

centièmes place

  • 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 au-delà de celui que vous souhaitez aller, donc 1 serait autour de la dixièmes , 2 pour centièmes , et ainsi de suite (0 tours à la la place, et négatif pour les dizaines, etc.)

5
répondu Tarvis 2014-09-18 03:44:30

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

4
répondu Vlad 2011-10-12 22:49:25

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
répondu Rushdi Shams 2011-10-13 01:12:30

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

donne = 3,54!

2
répondu Ankush G 2015-05-02 06:08:15

former comme une chaîne et convertir de nouveau en double je pense que vous donnera le résultat que vous voulez.

la valeur double ne sera pas ronde(), floor() ou ceil().

une solution rapide pour elle pourrait être:

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

vous pouvez utiliser la valeur S pour l'affichage ou la nouvelle valeur pour le calcul.

2
répondu Jao Assy 2015-11-27 02:44:22

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;
1
répondu Mitchell Hynes 2015-09-07 17:55:09

peut-être le suivant:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  
0
répondu Ritesh 2011-10-12 22:51:37

Une vérification rapide est d'utiliser les Mathématiques.étage méthode. 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
répondu chris31389 2014-10-05 17:18:18
//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 maladroit, mais je pense que cela peut résoudre votre problème :)

0
répondu user5251903 2016-02-07 13:04:03

j'ai une version légèrement modifiée 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));

}

sortie:

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
-1
répondu user1189617 2017-05-23 12:03:05

cela a fonctionné pour moi:

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

j'aime personnellement cette version parce qu'elle effectue l'arrondissement numériquement, plutôt que de la convertir en chaîne (ou similaire) et de la formater.

-1
répondu Rainbow975 2015-11-14 07:06:01