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;
floor
pour tronquer ne fonctionne que pour les valeurs positives.
RoundingMode.DOWN
comme RoudingMode.FLOOR
toujours, des arrondis vers l'infini négatif.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Vérifiez disponible RoundingMode
et DecimalFormat
.
DOWN
cela 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 double
est 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 DecimalFormat
pour obtenir un String
.
Si, pour une raison quelconque, vous ne souhaitez pas utiliser a, BigDecimal
vous pouvez convertir votre double
en un int
pour le tronquer.
Si vous souhaitez tronquer à l' emplacement des Unes :
int
Vers la dixième place:
int
double
Hundreths 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, decimalPlaces
serait 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.)
unroundedNumber
c'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 :)