2012-04-30 21 views
7

Jak wyodrębnić liczbę po kropce dziesiętnej za pomocą BigDecimal?Wyodrębnij liczbę dziesiętną w BigDecimal

BigDecimal d = BigDecimal.valueOf (1548.564);

wynik: jedynie wyciąg: 5649

+2

Uwaga: Należy użyć 'BigDecimal.valueOf ("1548.5649");' zamiast ponieważ konwersja pomiędzy 'double' i 'BigDecimal' może powodować dziwne efekty uboczne. Jeśli potrzebujesz precyzji, unikaj 'double' i' float'. –

+1

@AaronDigulla Myślę, że masz na myśli nowy BigDecimal ("1548.5649"), ponieważ nie ma metody BigDecimal.valueOf (String). –

Odpowiedz

10

Spróbuj:

BigDecimal d = BigDecimal.valueOf(1548.5649); 
BigDecimal result = d.subtract(d.setScale(0, RoundingMode.FLOOR)).movePointRight(d.scale());  
System.out.println(result); 

drukuje:

5649 
6

Spróbuj BigDecimal.remainder:

BigDecimal d = BigDecimal.valueOf(1548.5649); 
BigDecimal fraction = d.remainder(BigDecimal.ONE); 
System.out.println(fraction); 
// Outputs 0.5649 
+0

wyświetla: 1548.564900000000079671735875308513641357421875 – Mehdi

+1

Wyświetla "0.5649" dla mnie. –

+0

Tak, to prawda :) Dzięki;) – Mehdi

4

To powinno załatwić sprawę:

d.subtract(d.setScale(0, RoundingMode.FLOOR)); 

setScale() zaokrągla numer zero miejsc po przecinku, a mimo jego nazwa nie zmienia wartości d.

+0

To jest praca ... dzięki :) – Mehdi

-1

spróbować użyć d.doubleValue() uzyskać wartość podwójny

+2

zwraca ten sam numer: 1548.5649 – Mehdi

0

Nie powiem, jaki rodzaj chcesz wyniku. Najprostszym sposobem jest prawdopodobnie przekształcić BigDecimal na ciąg znaków, a także podejmować podciąg:

String s = d.toPlainString(); 
int i = s.indexOf('.'); 
if (i < 0) { 
    return ""; 
} 
return s.substring(i + 1); 
+0

Działa to tylko dla lokalizacji, która używa. jako separator dziesiętny. Ale są Locale, które używają,. – BetaRide

+0

@ BetaRide: Wiem o tym, mówię po francusku, i tutaj używany jest przecinek. Ale BigDecimal.toPlainString() nie jest locale-świadomy. Używa kropki jako separatora dziesiętnego niezależnie od lokalizacji. –

1

Jeśli wartość jest ujemna, przy użyciu d.subtract(d.setScale(0, RoundingMode.FLOOR)) zwróci nieprawidłowy dziesiętny.

Użyj tego:

BigInteger decimal = 
       d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger(); 

Zwraca 5649 dla 1548.5649 lub -1548.5649

Powiązane problemy