14 Stimmen

Java BigDecimal ohne E

Ich habe eine BigDecimal-Variable

BigDecimal x = new BigDecimal("5521.0000000001");

Formel:

x = x.add(new BigDecimal("-1")
      .multiply(x.divideToIntegralValue(new BigDecimal("1.0"))));

Ich möchte den ganzzahligen Teil entfernen, um den Wert zu erhalten x = ("0.0000000001") aber mein neuer Wert ist 1E-10 und nicht 0,0000000001.

23voto

Keppil Punkte 45223

Um eine String Darstellung der BigDecimal ohne den Exponententeil, können Sie
BigDecimal.toPlainString() . In Ihrem Beispiel:

BigDecimal x = new BigDecimal("5521.0000000001");
x = x.add(new BigDecimal("-1").
              multiply(x.divideToIntegralValue(new BigDecimal("1.0"))));
System.out.println(x.toPlainString());

druckt

0.0000000001

3voto

Akhilesh Awasthi Punkte 2688

Versuchen Sie BigDecimal.toPlainString() zu verwenden, um den Wert als einfache Zeichenkette zu erhalten.

2voto

Peter Lawrey Punkte 511323

Vielleicht hilft Ihnen die Verwendung von BigDecimal nicht wirklich weiter.

double d = 5521.0000000001;
double f = d - (long) d;
System.out.printf("%.10f%n", f);

druckt

0.0000000001

aber der Wert 5521.0000000001 ist nur eine ungefähre Darstellung.

Die aktuelle Darstellung lautet

double d = 5521.0000000001;
System.out.println(new BigDecimal(d));
BigDecimal db = new BigDecimal(d).subtract(new BigDecimal((long) d));
System.out.println(db);

druckt

5521.000000000100044417195022106170654296875
1.00044417195022106170654296875E-10

Ich vermute, dass das, was Sie versuchen, nicht sinnvoll ist, da Sie anscheinend versuchen, einen Wert zu erhalten, der nicht das ist, was Sie glauben, dass er ist.

1voto

Antonio Giordano Punkte 111

Wenn Sie dies an Ihrem BigDecimal-Objekt tun wollen und es nicht mit einem Formatierer in einen String umwandeln wollen, können Sie dies unter Java 8 in 2 Schritten tun:

  1. stripTrailingZeros()
  2. wenn scale < 0 setScale auf 0, wenn Sie esponential/wissenschaftlich nicht mögen Notation

Sie können diesen Ausschnitt ausprobieren, um das Verhalten besser zu verstehen

BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50.2
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//5E+1
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//50.2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X