2009-05-25 9 views
14

Ich versuche, einen Prozentsatz "Faktor" zu berechnen. Das heißt, bei einer 20%, wandeln Sie es in 0,2 um (meine Absicht ist, später Werte damit zu multiplizieren und die 20% der Werte zu erhalten).Java, BigDecimal. Probleme mit der Division

Wie dem auch sei, die Frage mit diesem Stück Code bezogen werden:

public static void main(String[] args) { 
    int roundingMode = BigDecimal.ROUND_FLOOR; 
    BigDecimal hundred = new BigDecimal("100"); 
    BigDecimal percentageFactor = null; 
    BigDecimal percentage = new BigDecimal("20"); 
    BigDecimal value = new BigDecimal("500"); 
    percentageFactor = percentage.divide(hundred, roundingMode); 
    float f = percentage.floatValue()/hundred.floatValue(); 
    f = value.floatValue() * f; 
    BigDecimal aux = value.multiply(percentageFactor); 
    System.out.println("factor:"+percentageFactor.toString()); 
    System.out.println("final falue:"+aux.toString()); 
    System.out.println("Float Value:"+f);  
} 

ich das Ergebnis dieser erwarten wäre so etwas wie sein:

factor: 0.2 
final value: 100 
float value: 100 

sondern percentage.divide(hundred, roundingMode); Null zurückkehrt, eine daher bekomme ich:

factor:0 
final falue:0 
Float Value:100.0 

Was mache ich falsch? Wie kann ich zwei große Dezimalstellen richtig teilen?

Übrigens verwende ich BigDecimal, weil ich monetäre Prozentsätze berechnen werde, also will ich Kontrolle über das Runden.

Antwort

9

Die Skala von new BigDecimal("20") Null verwenden, da Sie dort kein Komma haben. Das bedeutet, dass percentage.divide(hundred, BigDecimal.ROUND_FLOOR) Null ergibt (es ist effektiv int(20/100) oder 0).

Wenn Sie wirklich fraktionierte Sachen machen wollen, verwenden Sie new BigDecimal("20.00"), damit die Waage richtig eingestellt ist, oder verwenden Sie einen der anderen Konstruktoren, um die Waage speziell einzustellen.

Hier ist der Ausgang aus diesem einfachen Wechsel von 20-20.00, komplett mit Ihrem spellink misteak :-)

factor:0.20 
final falue:100.00 
Float Value:100.0 
13

Ich denke, dass die beste Lösung, um den angeforderten Maßstab zu setzen ist, wenn Dividieren: vielleicht in diesem Fall 2.

BigDecimal hundred = new BigDecimal(100); 
    BigDecimal percentage = new BigDecimal(20); 
    BigDecimal value = new BigDecimal(500); 
    BigDecimal percentageFactor = 
       percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP); 

    value = value.multiply(percentageFactor); 
    System.out.println("final value:"+ value); 

Endwertes 100.00

(Multiplikation wird unter Verwendung der Skala aus den Faktoren (0 + 2), aber es kann b e wurde auch angegeben.)

Ich würde HALF_UP für die Buchhaltung (in meiner Gesetzgebung) oder EVEN (für Statistiken) für den Rundungsmodus verwenden.

0

Float hat nur 6 Ziffern Genauigkeit und ist fast nie eine gute Wahl, würde ich vorschlagen, dass Sie stattdessen Doppel. (oder BigDecimal kann in einigen Fällen besser sein)

+0

Wenn Sie Kontrolle über das Runden wollen, sollten Sie überhaupt keine Fließkommazahlen verwenden, weder float noch double. Bleib bei BigDecimal. – markusk

+0

Oft muss nur das Endergebnis gerundet werden, so dass Sie BigDecimal nur zum Runden des Ergebnisses (oder einer einfachen Hilfsmethode) verwendet haben. Dies kann wesentlich einfacher und schneller sein. –