Par exemple, j'ai la variable 3.545555555, que je voudrais tronquer à seulement 3,54.
Par exemple, j'ai la variable 3.545555555, que je voudrais tronquer à seulement 3,54.
Réponses:
Si vous le souhaitez à des fins d'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;
floorpour tronquer ne fonctionne que pour les valeurs positives.
RoundingMode.DOWNcomme RoudingMode.FLOORtoujours, des arrondis vers l'infini négatif.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Vérifiez disponible RoundingModeet DecimalFormat.
DOWNcela a effectivement l'effet de troncature pour les nombres positifs et négatifs. Comme vu dans le tableau des exemples dans le doc .
Bit Old Forum, Aucune des réponses ci-dessus n'a fonctionné pour les valeurs positives et négatives (je veux dire pour le calcul et simplement pour tronquer sans arrondir). À partir du lien Comment arrondir un nombre à n décimales dans 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);
}
}
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
Notons d' abord que doubleest une fraction binaire et ne pas vraiment avoir décimales.
Si vous avez besoin de décimales, utilisez a BigDecimal, qui a une setScale()méthode de troncature, ou utilisez DecimalFormatpour obtenir un String.
Si, pour une raison quelconque, vous ne souhaitez pas utiliser a, BigDecimalvous pouvez convertir votre doubleen un intpour le tronquer.
Si vous souhaitez tronquer à l' emplacement des Unes :
intVers la dixième place:
intdoubleHundreths place
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, decimalPlacesserait le nombre de places PASSÉ les endroit où vous voulez aller, donc 1 arrondissent à la dixième place, 2 aux centièmes , et ainsi de suite (0 tours au ceux lieu, et un négatif aux dizaines , etc.)
unroundedNumberc'est assez gros. Cela peut fonctionner pour l'exemple de la question, mais une solution générale devrait fonctionner pour tout double.
Le formatage sous forme de chaîne et la conversion en double, je pense, vous donneront le résultat souhaité.
La valeur double ne sera pas round (), floor () ou ceil ().
Une solution rapide pour cela pourrait être:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Vous pouvez utiliser sValue à des fins d'affichage ou newValue pour le calcul.
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
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 également être fait:
a=Math.floor(a*100) / 100;
Peut-être suivant:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
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;
}
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));
}
Production:
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
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 car elle effectue en fait l'arrondi numériquement, plutôt qu'en la convertissant en chaîne (ou similaire), puis en la formatant.
//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 peut être un peu gênant, mais je pense que cela peut résoudre votre problème :)