2016-04-04 10 views
3

Ich muss ein Long (Objekt eins, enthalten in der Variable 'longValueToConvert') in ein BigDecimal konvertieren.Long to String vor der Konvertierung in ein BigDecimal

ich so etwas getan hätte:

new BigDecimal(longValueToConvert) 

Aber ich habe gelesen, dass diese Besetzung Fehler bei der Umwandlung induzieren könnte und dass es bevorzugt wird, die lange in einen String zu werfen, bevor sie an die Verwendung von BigDecimal-Konstruktor.

new BigDecimal(longValueToConvert.toString()) 

Ist es ok, die erste oder die zweite zu verwenden, wäre vorzuziehen? Ich benutze Java 8.

+0

Es gibt keine Besetzung im Code, und nein, es verursacht keinen Konvertierungsfehler. –

Antwort

11

Sie haben falsch gehört. Es gibt keinen Konvertierungsfehler vom BigDecimal(long) Konstruktor. Eine long kann genau dargestellt werden und es gibt kein Problem damit, eine BigDecimal daraus zu machen.

Sie müssen nur vorsichtig sein, wenn Sie den BigDecimal(double) Konstruktor verwenden. Dies liegt daran, dass einige double Werte nicht genau dargestellt werden können. Aus der Dokumentation:

Die Ergebnisse dieses Konstruktors können etwas unvorhersehbar sein. Man könnte annehmen, dass das Schreiben von new BigDecimal(0.1) in Java eine BigDecimal erzeugt, die exakt gleich 0.1 [...] ist, aber tatsächlich gleich 0.1000000000000000055511151231257827021181583404541015625 ist. Dies liegt daran, 0.1 kann nicht genau dargestellt werden als double [...].

Der String Konstruktor, auf der anderen Seite, ist vollkommen vorhersehbar: Schreiben new BigDecimal("0.1") eine BigDecimal erzeugt, die zu 0.1 genau gleich ist, wie man erwarten würde. Daher wird im Allgemeinen empfohlen, den Konstruktor String bevorzugt zu verwenden.

+2

Auch die [factory Methoden] (https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#valueOf-long-int-) sind vorzuziehen, da sie nicht immer funktionieren Erstelle ein neues Objekt. – bcsb1001

1

Sie können dies versuchen:

new BigDecimal(longValueToConvert.longValue()) 

Dies funktioniert gut. Ich glaube, Ihr Anliegen sollte sein, wenn Sie Gleitkommazahlen darstellen, da die Genauigkeit dort zählt. z.B. wenn Sie BigDecimal (double) oder BigDecimal(float) Konstruktoren verwenden. Hast du diese Szenarien? Auch der Name hier sagt dir alles. Long zu irgendeiner Fließkommazahl ist kein Problem, aber das Kommen von den anderen Richtungen erfordert Sorgfalt.

+1

Während dies funktioniert, wird das Ergebnis genau das gleiche sein wie 'new BigDecimal (longValueToConvert)' –

+0

* "[Konvertieren von a] long zu irgendeiner Fließkommazahl ist kein Problem" * - Konvertieren von 'long' in a 'float' oder' double' * kann zu einem Verlust der Genauigkeit führen. –

+0

Warum eine lange in eine lange konvertieren? Macht für mich keinen Sinn. –