String in Java in BigDecimal umwandeln

Lesezeit: 3 Minuten

Benutzer-Avatar
Hari Rao

Ich lese eine Währung aus XML in Java.

String currency = "135.69";

Wenn ich das umwandle BigDecimal Ich bekomme:

 System.out.println(new BigDecimal(135.69));

Ausgabe:

135.68999999999999772626324556767940521240234375.

Warum gibt es so viele Zahlen aus? Wie kann ich das vermeiden? Ich möchte nur, dass es 135,69 ausgibt.

  • Sie sicher Art von currency ist Schnur? Und Sie lesen den Wert nur als Zeichenfolge?

    – Rohit Jain

    28. Februar 2015 um 16:21 Uhr

  • mögliches Duplikat von Bestimmte Genauigkeit eines BigDecimal festlegen

    – Robert Moskal

    28. Februar 2015 um 16:21 Uhr

  • Ihre Währung ist nicht einmal eine String beginnen mit; benutze einfach die BigDecimal Konstrukteur mit a String als Argument.

    – fg

    28. Februar 2015 um 16:24 Uhr

  • Es könnte viele Lösungen geben, aber wissen Sie, warum es passiert? Lesen Sie dies, wenn Sie dies nicht tun: effbot.org/pyfaq/…

    – Cem Kalyoncu

    28. Februar 2015 um 17:32 Uhr


Benutzer-Avatar
Marlon Patrick

Der BigDecimal(double)-Konstruktor kann unvorhersehbares Verhalten aufweisen. Verwenden Sie vorzugsweise BigDecimal(String) oder BigDecimal.valueOf(double).

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

Die Dokumentation für BigDecimal (doppelt) erklärt ausführlich:

  1. Die Ergebnisse dieses Konstruktors können etwas unvorhersehbar sein. Man könnte annehmen, dass das Schreiben von new BigDecimal(0.1) in Java ein BigDecimal erzeugt, das genau gleich 0,1 ist (ein unskalierter Wert von 1, mit einer Skalierung von 1), aber es ist tatsächlich gleich 0,1000000000000000055511151231257827021181583404541015625. Das liegt daran, dass 0,1 nicht exakt als Double (oder übrigens als binärer Bruch beliebiger Länge) dargestellt werden kann. Daher ist der Wert, der an den Konstruktor übergeben wird, ungeachtet des Aussehens nicht genau gleich 0,1.
  2. Der String-Konstruktor hingegen ist perfekt vorhersagbar: Das Schreiben von new BigDecimal(“0.1”) erzeugt ein BigDecimal, das genau gleich 0.1 ist, wie man es erwarten würde. Daher wird generell empfohlen, den String-Konstruktor diesem vorzuziehen.
  3. Wenn ein Double als Quelle für ein BigDecimal verwendet werden muss, beachten Sie, dass dieser Konstruktor eine exakte Konvertierung bereitstellt; Es ergibt nicht das gleiche Ergebnis wie das Konvertieren des Doubles in einen String mit der Double.toString(double)-Methode und der anschließenden Verwendung des BigDecimal(String)-Konstruktors. Um dieses Ergebnis zu erhalten, verwenden Sie die statische valueOf(double)-Methode.

  • Was würden Sie sagen, wenn Sie in einem Dienst sind und nur in einer Zeichenfolge übergeben würden. Beachten Sie, dass es sich um eine ganze Zahl, ein Double usw. handeln kann.

    – PeterS

    1. März 2019 um 12:30 Uhr

  • In diesem Fall würde ich new BigDecimal (“string_value”) verwenden. Auf diese Weise würde es sowohl für Ganzzahlen als auch für Dezimalzahlen korrekt funktionieren.

    – Marlon Patrick

    1. März 2019 um 18:46 Uhr

String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

  • Es ist keine gute Praxis, den Konstruktor zu verwenden, um die Klassen “String”, “BigInteger”, “BigDecimal” und primitive Wrapper zu instanziieren. rules.sonarsource.com/java/RSPEC-2129

    – Nate Getch

    24. Mai 2019 um 21:18 Uhr

Sie speichern 135,69 als String in Währung. Aber anstatt die variable Währung zu übergeben, übergeben Sie erneut 135,69 (doppelter Wert) an new BigDecimal(). Sie sehen also viele Zahlen in der Ausgabe. Wenn Sie die Währungsvariable übergeben, lautet Ihre Ausgabe 135,69

Darf ich etwas hinzufügen. Wenn Sie eine Währung verwenden, sollten Sie Scale(2) verwenden, und Sie sollten wahrscheinlich eine runde Methode finden.

BigDecimal b = BigDecimal.valueOf(d);

import java.math.*; 

public class Test { 

    public static void main(String[] args) 
    { 

        // Creating a Double Object 
        Double d = new Double("785.254"); 

        /// Assigning the bigdecimal value of ln to b 
        BigDecimal b = BigDecimal.valueOf(d); 

        // Displaying BigDecimal value 
        System.out.println("The Converted BigDecimal value is: " + b); 
    } 
}

Benutzer-Avatar
kaltes_Gebräu

Spring Framework bietet eine hervorragende utils-Klasse, um dies zu erreichen.

Gebrauchsklasse : NumberUtils

Konvertierung von Zeichenfolge zu BigDecimal –

NumberUtils.parseNumber("135.00", BigDecimal.class);

Benutzer-Avatar
Anubis

Hallo Leute, Sie können Strings nicht direkt in Bigdecimal umwandeln

Sie müssen es zuerst in lange umwandeln, danach werden Sie große Dezimalzahlen umwandeln

String currency = "135.69"; 
Long rate1=Long.valueOf((currency ));            
System.out.println(BigDecimal.valueOf(rate1));

1245820cookie-checkString in Java in BigDecimal umwandeln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy