Na przykład mam zmienną 3.545555555, którą chciałbym skrócić do zaledwie 3,54.
java
double
truncate
decimalformat
Jasio
źródło
źródło
Odpowiedzi:
Jeśli chcesz to do celów wyświetlania, użyj
java.text.DecimalFormat
:new DecimalFormat("#.##").format(dblVar);
Jeśli potrzebujesz go do obliczeń, użyj
java.lang.Math
:Math.floor(value * 100) / 100;
źródło
floor
do obcinania działa tylko w przypadku wartości dodatnich.RoundingMode.DOWN
jakRoudingMode.FLOOR
zawsze zaokrągla w kierunku ujemnej nieskończoności.DecimalFormat df = new DecimalFormat(fmt); df.setRoundingMode(RoundingMode.DOWN); s = df.format(d);
Sprawdź dostępne
RoundingMode
iDecimalFormat
.źródło
DOWN
rzeczywiście ma to wpływ na obcięcie liczb dodatnich i ujemnych. Jak widać w tabeli przykładów w dok .Bit Old Forum, Żadna z powyższych odpowiedzi nie działała zarówno dla wartości dodatnich, jak i ujemnych (mam na myśli obliczenia i po prostu obcinanie bez zaokrąglania). Z linku Jak zaokrąglić liczbę do n miejsc dziesiętnych w języku 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); } }
Ta metoda działała dobrze dla mnie.
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));
Wyniki:
0.00 9.62 9.62 9.62 9.62 9.99 -9.99 -9.00
źródło
Zauważ najpierw, że a
double
jest ułamkiem binarnym i tak naprawdę nie ma miejsc dziesiętnych.Jeśli potrzebujesz miejsc dziesiętnych, użyj a
BigDecimal
, który masetScale()
metodę obcinania, lub użyj,DecimalFormat
aby uzyskaćString
.źródło
Jeśli z jakiegoś powodu nie chcesz użyć a
BigDecimal
, możesz rzucićdouble
na an,int
aby go skrócić.Jeśli chcesz skrócić do miejsca Ones :
int
Na dziesiąte miejsce:
int
double
Setki miejsc
Przykład:
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; }
W tym przykładzie
decimalPlaces
byłaby to liczba ostatnich miejsc, do których chcesz się udać, więc 1 zaokrągliłoby do dziesiątych miejsc, 2 do setnych itd. (0 zaokrągliło do jedności , a ujemne jedno do dziesiątek itp.)źródło
unroundedNumber
jest wystarczająco duże. Może działać na przykład w pytaniu, ale ogólne rozwiązanie powinno działać w przypadku każdegodouble
.Wydaje mi się, że sformatowanie jako ciąg i zamiana z powrotem na podwójne da pożądany wynik.
Podwójna wartość nie będzie round (), floor () ani ceil ().
Szybkim rozwiązaniem może być:
String sValue = (String) String.format("%.2f", oldValue); Double newValue = Double.parseDouble(sValue);
Możesz użyć sValue do celów wyświetlania lub newValue do obliczeń.
źródło
Może
Math.floor(value * 100) / 100
? Pamiętaj, że wartości takie jak3.54
mogą nie być dokładnie reprezentowane przez rozszerzeniedouble
.źródło
Możesz użyć obiektu NumberFormat Class do wykonania zadania.
// 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
źródło
3.545555555, aby uzyskać 3.54. Spróbuj tego:
DecimalFormat df = new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.FLOOR); double result = new Double(df.format(3.545555555);
To da = 3,54!
źródło
Oto metoda, której używam:
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
Można to również zrobić:
a=Math.floor(a*100) / 100;
źródło
Może po:
double roundTwoDecimals(double d) { DecimalFormat twoDForm = new DecimalFormat("#.##"); return Double.valueOf(twoDForm.format(d)); }
źródło
Szybkim sprawdzeniem jest użycie metody Math.floor. Utworzyłem poniżej metodę sprawdzania podwójnego dla dwóch lub mniej miejsc po przecinku:
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; }
źródło
Mam nieco zmodyfikowaną wersję 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)); }
Wynik:
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
źródło
To zadziałało dla mnie:
double input = 104.8695412 //For example long roundedInt = Math.round(input * 100); double result = (double) roundedInt/100; //result == 104.87
Osobiście podoba mi się ta wersja, ponieważ w rzeczywistości wykonuje zaokrąglanie liczbowo, zamiast konwertować ją na łańcuch (lub podobny), a następnie formatować.
źródło
//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
cóż, może to być trochę niezręczne, ale myślę, że może rozwiązać twój problem :)
źródło