2012-12-16 16 views
38

Mam obiekt BigDecimal i chcę go przekonwertować na ciąg. Problemem jest to, że moja wartość dostał frakcji i dostaję ogromną liczbę (na długość) i potrzebuje tylko oryginalny numer w ciągu znaków na przykład: dlaBigDecimal na ciąg

BigDecimal bd = new BigDecimal(10.0001) 
System.out.println(bd.toString()); 
System.out.println(bd.toPlainString()); 

wyjście jest:

10.000099999999999766941982670687139034271240234375 
10.000099999999999766941982670687139034271240234375 

i potrzebuje obecnie wprowadzone do być dokładnie numer 10.0001 w ciąg

Odpowiedz

81

aby uzyskać dokładnie 10.0001 trzeba użyć konstruktora String lub valueOf (który konstruuje BigDecimal na podstawie kanonicznej reprezentacji podwójne):

BigDecimal bd = new BigDecimal("10.0001"); 
System.out.println(bd.toString()); // prints 10.0001 
//or alternatively 
BigDecimal bd = BigDecimal.valueOf(10.0001); 
System.out.println(bd.toString()); // prints 10.0001 

Problem z new BigDecimal(10.0001) jest to, że argument jest double i zdarza się, że debel nie może reprezentować 10.0001 dokładnie. Tak więc 10.0001 jest "przekształcany" w najbliższe możliwe podwójne, czyli 10.000099999999999766941982670687139034271240234375 i to właśnie pokazuje twój BigDecimal.

Z tego powodu rzadko ma sens używanie podwójnego konstruktora.

Możesz przeczytać więcej o tym tutaj, Moving decimal places over in a double

+0

sposób bardziej efektywny od konwersja 'podwójnego' w ten sposób polega na użyciu' BigDecimal.valueOf (double); ' –

+0

@PeterLawrey Nie jestem pewien, czy rozumiem. 'BigDecimal.valueOf (double)' "zaokrągla" double w ten sam sposób dublety są zaokrąglane po wydrukowaniu, co wymaga nieco skomplikowanych reguł, więc nie jestem pewien jak na tym polegać. – assylias

+0

'Przekształca dwukrotnie w BigDecimal, używając kanonicznej reprezentacji podwójnej udostępnionej przez metodę Double.toString (double). Uwaga: Zwykle jest to preferowany sposób przekształcania podwójnego (lub zmiennopozycyjnego) w BigDecimal, ponieważ zwrócona wartość jest równa wartości wynikającej z konstrukcji BigDecimal z wyniku użycia Double.toString (double). " –

8

Twój BigDecimal nie zawiera numer 10.0001, bo zainicjowany go z double, a double nie dość zawierać numer myślał, że zrobił. (Jest to cały punkt BigDecimal.)

Jeśli używasz the string-based constructor zamiast:

BigDecimal bd = new BigDecimal("10.0001"); 

... to będzie faktycznie zawierać numer można oczekiwać.

0

BigDecimal nie może być podwójny. możesz użyć numeru Int. Jeśli chcesz wyświetlić dokładnie własny numer, możesz użyć konstruktora String BigDecimal.

tak:

BigDecimal bd1 = new BigDecimal("10.0001"); 

teraz można wyświetlać BD1 jako 10.0001

takie proste. DOBRE SZCZĘŚCIE.

5

Za pomocą poniższej metody można przekonwertować plik java.math.BigDecimal na ciąg.

BigDecimal bigDecimal = new BigDecimal("10.0001"); 
    String bigDecimalString = String.valueOf(bigDecimal.doubleValue()); 
    System.out.println("bigDecimal value in String: "+bigDecimalString); 

wyjściowa:
wartość BigDecimal w String: 10.0001

1
// Convert BigDecimal number To String by using below method // 

public static String RemoveTrailingZeros(BigDecimal tempDecimal) 
{ 
    tempDecimal = tempDecimal.stripTrailingZeros(); 
    String tempString = tempDecimal.toPlainString(); 
    return tempString; 
} 

// Recall RemoveTrailingZeros 
BigDecimal output = new BigDecimal(0); 
String str = RemoveTrailingZeros(output); 
0

do uzyskania niezbędnej wynik z podwójnym konstruktora trzeba zaokrąglić BigDecimal przed przekonwertować go na przykład String

nowy java.math.BigDecimal (10,0001) .round (nowa java.math.MathContext (6, java.math.RoundingMode.HALF_UP)). ToString()

wydrukuje "10.0001"

0

Dla lepszego wsparcia różnych lokalizacjach używać w ten sposób:

DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(2); 
df.setMinimumFractionDigits(0); 
df.setGroupingUsed(false); 

df.format(bigDecimal); 

także można go dostosować:

DecimalFormat df = new DecimalFormat("###,###,###"); 
df.format(bigDecimal);