2012-06-24 19 views
7

Mam zamiar użyć BigDecimal do porównania dwóch wartości walut zaokrąglonych do 2 cyfr. Na przykład spodziewam się, że poniższe przyniosą 0, ponieważ porównuję coś, co powinno zaokrąglić do 0.02 z czymś, co wynosi 0.02. Ale daje -1 !! Czy jest to właściwy sposób?BigDecimal w Javie

Powinno to również działać w przypadku większych liczb, takich jak 123.45 w stosunku do 123.4534 ... które powinny dać 0, gdy "compareTo" jest używane.

Próbowałem używać kontekstu matematycznego, ale nie wydaje się elegancki ... czy istnieje poprawny sposób?

BigDecimal spread = new BigDecimal(0.01934); 
spread.setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02))); 

i roztwór:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN); 
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN); 
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread)); 

Odpowiedz

5

0,02 zostanie oceniona

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

Trzeba setScale (2, RoundingMode.HALF_EVEN) tam.

+0

To kolejny sposób uzyskania dokładnej liczby zmiennoprzecinkowej. 1+. –

+0

Musiał użyć obu pomysłów, aby to naprawić. Czy wysłać prawidłowy kod. – fodon

10

pierwsze, BigDecimal jest niezmienna. Musisz zwrócić wynik z setScale wywołania metody:

spread = spread.setScale(2, RoundingMode.HALF_EVEN); 

Następnie należy poprawić dokładność drugiego BigDecimal ponieważ jest pochodzący z podwójnym - niezbyt dokładne podmiotu. Więc spróbuj String:

spread.compareTo(new BigDecimal("0.02")) 
+0

To jest rzeczywiście używane do porównywania cen. Być może trzeba je utworzyć z podwójnych. – fodon

+0

@fodon: Wtedy użytkownik nieznany ma część twojej odpowiedzi dla ciebie, a ja mam drugą część (odnośnie tego, że BigDecimal jest niezmienny). –

+1

Powróciłem niepoprawną edycję. Ludzie, proszę _comment_ lub daj _oddalną odpowiedź_, jeśli nie jesteś zadowolony z odpowiedzi, którą widzisz. –