2014-02-07 15 views
6

Ich möchte den ganzzahligen Teil und Dezimal Teil aus dem bigdecimal in Java extrahieren.Extrahieren der Ganzzahl und Bruchteil von Bigdecimal in Java

Ich verwende den folgenden Code dafür.

BigDecimal bd = BigDecimal.valueOf(-1.30) 
    String textBD = bd.toPlainString(); 
    System.out.println("length = "+textBD.length()); 
    int radixLoc = textBD.indexOf('.'); 
    System.out.println("Fraction "+textBD.substring(0,radixLoc)+"Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 

Ich erhalte die Ausgabe als

-1 und 3

Aber ich will, sollte die Hinter Null auch von -1,30

Ausgang sein -1 und 30

+1

Sie wissen, dass '-1.3 == -1.30', so dass es nicht notwendig ist, die zweite Dezimalzahl zu speichern, und deshalb erhalten Sie es nicht. Sie müssen ein Zahlenformat anstelle von toPlainString() verwenden. –

+0

führend == die 0 an der Front. Sie wollen die * trailing * Null. –

Antwort

4

Die Gleitkommadarstellung von -1,30 nicht exakt ist. Hier ist eine leichte Modifikation des Codes:

BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP); 
String textBD = bd.toPlainString(); 
System.out.println("text version, length = <" + textBD + ">, " + textBD.length()); 
int radixLoc = textBD.indexOf('.'); 
System.out.println("Fraction " + textBD.substring(0, radixLoc) 
    + ". Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 

Ich habe eine RoundingMode auf dem setScale setzen fraktionierte Pennies wie 1,295 „Halb up“ abzurunden bis 1,30.

Die Ergebnisse sind:

text version, length = <-1.30>, 5 
Fraction -1. Cents: 30 
+0

Das wird nicht zwischen 1,25 und 1,30 runden. Es würde jedoch 1.295 bis 1.3 betragen. – GriffeyDog

+0

Richtig du bist, GriffeyDog. Vielen Dank. Bearbeiten meiner Antwort. – rajah9

1

Mit einem String initialisieren, um Probleme zu vermeiden h Gleitpunktgenauigkeit. Dann setScale verwenden Sie die gewünschte Anzahl der Dezimalstellen festlegen:

BigDecimal bd = new BigDecimal("-1.30").setScale(2); 
String textBD = bd.toPlainString(); 
System.out.println("length = "+textBD.length()); 
int radixLoc = textBD.indexOf('.'); 
System.out.println("Fraction "+textBD.substring(0,radixLoc)+"Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 
3

Wenn Sie nicht mit Strings einzumischen (was ich denke, es ist keine gute Praxis - mit Ausnahme des Teils de BigDecimal schaffen) Sie es nur mit Mathe tun könnte:

// [1] Creating and rounding (just like GriffeyDog suggested) so you can sure scale are 2 
BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP); 

// [2] Fraction part (0.30) 
BigDecimal fraction = bd.remainder(BigDecimal.ONE); 

// [3] Fraction as integer - move the decimal. 
BigDecimal fraction2 = fraction.movePointRight(bd.scale()); 

// [4] And the Integer part can result of: 
BigDecimal natural = bd.subtract(fraction); 

// [5] Since the fraction part of 'natural' is just Zeros, you can setScale(0) without worry about rounding 
natural = natural.setScale(0); 

Ich weiß, mein Englisch ist schrecklich. Fühlen Sie sich frei zu korrigieren, wenn Sie verstehen könnten, was ich zu sagen versuchte. Vielen Dank.

+0

@denov Nett ... Ich war mir dieser Methode nicht bewusst ... Immer etwas neues lernen;) –