2012-10-17 10 views
34

Wie multipliziert man ein BigDecimal mit einer Ganzzahl in Java? Ich habe das versucht, aber es ist nicht korrekt.Wie man ein BigDecimal mit einer Ganzzahl in Java multipliziert

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

Welches Problem hinzuzufügen versuchen, erhalten Sie? –

+0

Ich würde annehmen, dass es der Kompilierungsfehler ist, da 'multiplizieren' ein anderes' BigDecimal' nimmt? –

+0

Woher wissen Sie, dass es nicht korrekt ist? –

Antwort

61

Sie haben eine Menge von Typ-Mismatches in Ihrem Code wie versuchen, einen int Wert zu setzen, wo BigDecimal erforderlich ist. Die korrigierte Version des Codes:

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. Ich hatte Recht mit dem 'BigDecimal (int)' - Konstruktor. : P –

+2

Die Verwendung von 'BigDecimal.valueOf (itemQuantity)' anstelle des Konstruktors verwendet BigDecimals null bis zehn und vermeidet damit die Konstruktion neuer Objekte. – chrsalln

2

First off, BigDecimal.multiply() gibt ein BigDecimal und Sie versuchen, dass speichern in einem int.

Zweitens ist es nimmt andere BigDecimal als Argument, kein int.

Wenn Sie nur die BigDecimal für alle Variablen verwenden, die an diesen Berechnungen beteiligt sind, sollte es gut funktionieren.

3

Wenn ich Sie wäre, würde ich das Ausmaß der BigDecimal eingestellt, so dass ich auf langen Zahlen am Ende nicht. Die Ganzzahl 2 in der BigDecimal-Initialisierung unten setzt die Skalierung.

Da Sie viel Mismatch des Datentyps haben, habe ich es entsprechend angepasst.

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 sind Gegenstand, nicht Primitiven, so stellen Sie sicher, dass Sie initialisieren itemCost und totalCost, sonst kann es geben Sie Nullpointer, während Sie auf totalCost oder itemCost

+0

+1 für die Betonung des Problems über die Skala. Wenn Sie gerade dabei sind, beachten Sie bitte, dass Ihre Multiplikation mit 'itemCost' enden wird, der eine Skalierung von' 4' hat, nicht '2':" Gibt ein BigDecimal zurück, dessen Wert (dieser × Multiplikand) ist und dessen Skalierung (this.scale() + multiplicand.scale()) "https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#multiply-java.math.BigDecimal- – pyb

Verwandte Themen