Par exemple, j'ai la variable 3.545555555, que je voudrais tronquer à 3,54.
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;
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Vérifier les disponibilités RoundingMode
et DecimalFormat
.
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
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
.
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:
int
Au Dixièmes lieu:
int
double
Hundreths lieu
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.)
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
.
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 aussi être fait:
a=Math.floor(a*100) / 100;
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!
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.
//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 :)
Peut-être après:
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;
}