2012-10-17 16 views
34

Jak mnożyć BigDecimal przez liczbę całkowitą w Javie? Próbowałem tego, ale nie jest to poprawne.Jak pomnożyć BigDecimal przez liczbę całkowitą w Javie

import java.math.BigDecimal; 
import java.math.MathContext; 

public class Payment { 
    int itemCost; 
    int totalCost = 0; 

    public BigDecimal calculateCost(int itemQuantity,BigDecimal itemPrice){ 
     itemCost = itemPrice.multiply(itemQuantity); 
     totalCost = totalCost + itemCost; 
    return totalCost; 
    } 
+3

Jaki problem jest wyświetlany? –

+0

Założę się, że jest to błąd kompilacji, ponieważ 'multiply' ma inny' BigDecimal'? –

+0

Skąd wiesz, że to nie jest poprawne? –

Odpowiedz

61

Masz dużo typu niedopasowania w kodzie, takie jak dążenie do wartości int gdzie wymagana jest BigDecimal. Skorygowana wersja kodu:

public class Payment 
{ 
    BigDecimal itemCost = BigDecimal.ZERO; 
    BigDecimal totalCost = BigDecimal.ZERO; 

    public BigDecimal calculateCost(int itemQuantity, BigDecimal itemPrice) 
    { 
     itemCost = itemPrice.multiply(new BigDecimal(itemQuantity)); 
     totalCost = totalCost.add(itemCost); 
     return totalCost; 
    } 
} 
+0

Heh. Miałem rację co do konstruktora BigDecimal (int) '. : P –

+2

Używając 'BigDecimal.valueOf (itemQuantity)', zamiast konstruktora, ponownie użyje BigDecimals od zera do dziesięciu, unikając prawdopodobnej konstrukcji nowego obiektu. – chrsalln

2

pierwsze, BigDecimal.multiply() zwraca BigDecimal i próbujesz zapisać, że w int.

Po drugie, jako przyjmuje się inny BigDecimal jako argument, a nie jako int.

Jeśli po prostu użyjesz BigDecimal dla wszystkich zmiennych związanych z tymi obliczeniami, powinno to działać poprawnie.

3

If I were you, chciałbym ustawić skalę BigDecimal tak, że nie kończy się na długich liczbach. Liczba całkowita 2 w inicjalizacji BigDecimal poniżej ustawia skalę.

Ponieważ występuje wiele niedopasowań typów danych, zmieniłem je odpowiednio w celu dostosowania.

class Payment 
{ 
     BigDecimal itemCost=new BigDecimal(BigInteger.ZERO, 2); 
     BigDecimal totalCost=new BigDecimal(BigInteger.ZERO, 2); 

    public BigDecimal calculateCost(int itemQuantity,BigDecimal itemPrice) 
     { 
      BigDecimal itemCost = itemPrice.multiply(new BigDecimal(itemQuantity)); 
      return totalCost.add(itemCost); 
     } 
    } 

BigDecimals są obiektu, a nie prymitywy, więc upewnij się zainicjować itemCost i totalCost, w przeciwnym razie może dać Ci NullPointer podczas próby dodania na totalCost lub itemCost

+0

+1 za podkreślenie problemu dotyczącego skali. Kiedy już to zrobisz, zwróć uwagę, że twoje mnożenie zakończy się słowem 'itemCost' o skali' 4', a nie '2':" Zwraca BigDecimal, którego wartość to (this x multiplicand), a którego waga to (this.scale() + multiplicand.scale()) "https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#multiply-java.math.BigDecimal- – pyb

Powiązane problemy