Ad esempio, ho la variabile 3.545555555, che vorrei troncare a soli 3.54.
Ad esempio, ho la variabile 3.545555555, che vorrei troncare a soli 3.54.
Risposte:
Se lo desideri per scopi di visualizzazione, usa java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Se ne hai bisogno per i calcoli, usa java.lang.Math
:
Math.floor(value * 100) / 100;
floor
di troncare funziona solo per valori positivi.
RoundingMode.DOWN
come RoudingMode.FLOOR
sempre arrotondamenti verso l'infinito negativo.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Verifica disponibile RoundingMode
e DecimalFormat
.
DOWN
ha effettivamente l'effetto di troncamento sia per i numeri positivi che per quelli negativi. Come si vede nella tabella degli esempi nel doc .
Bit Old Forum, nessuna delle risposte precedenti ha funzionato sia per valori positivi che negativi (intendo per il calcolo e solo per troncare senza arrotondamento). Dal collegamento Come arrotondare un numero an decimale in 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);
}
}
Questo metodo ha funzionato bene per me.
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));
Risultati:
0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00
Nota prima che una double
è una frazione binaria e in realtà non hanno cifre decimali.
Se hai bisogno di posizioni decimali, usa a BigDecimal
, che ha un setScale()
metodo per il troncamento, o usa DecimalFormat
per ottenere a String
.
Se, per qualsiasi motivo, non vuoi usare a BigDecimal
, puoi lanciarlo double
in an int
per troncarlo.
Se vuoi troncare al posto Ones :
int
Al decimo posto:
int
double
Centinaia di posti
Esempio:
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;
}
In questo esempio, decimalPlaces
sarebbe il numero di posti PASSATO quelli luogo che si desidera andare, in modo da 1 sarebbe intorno al decimo posto, 2 ai centesimi , e così via (0 giri al quelle posto, e uno negativo per le decine , eccetera.)
unroundedNumber
sono abbastanza grandi. Potrebbe funzionare per l'esempio nella domanda, ma una soluzione generale dovrebbe funzionare per qualsiasi double
.
Formattare come una stringa e riconvertire in doppio penso che ti darà il risultato che desideri.
Il valore double non sarà round (), floor () o ceil ().
Una soluzione rapida potrebbe essere:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
È possibile utilizzare sValue per scopi di visualizzazione o newValue per il calcolo.
È possibile utilizzare l'oggetto NumberFormat Class per eseguire l'attività.
// 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
Ecco il metodo che utilizzo:
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
Questo può essere fatto anche:
a=Math.floor(a*100) / 100;
Forse seguendo:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Un rapido controllo consiste nell'usare il metodo Math.floor. Ho creato un metodo per controllare un doppio per due o meno cifre decimali di seguito:
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;
}
Ho una versione leggermente modificata di 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));
}
Produzione:
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
Questo ha funzionato per me:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Personalmente mi piace questa versione perché esegue effettivamente l'arrotondamento numericamente, anziché convertirlo in una stringa (o simile) e quindi formattarlo.
//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
beh questo potrebbe essere un po 'imbarazzante, ma penso che possa risolvere il tuo problema :)