Frage

Welche Daten Typ ist geeignet zur Darstellung einer Dezimalzahl wie "10364055.81".

Wenn versucht mit Doppel:

double d = 10364055.81;

Aber wenn ich versuche zu drucken, die Anzahl, seine Darstellung als "1.036405581E7",, das will ich nicht.

Sollte ich verwende BigDecimal?Aber seine Darstellung als 10364055.81000000052154064178466796875.Gibt es eine Datentyp, zeigt die Werte an, als es ist?Auch die Anzahl kann größer sein, als die, die genommen als Beispiel.

BTW, wird die Verwendung von BigDecimal Einfluss auf die Leistung der Anwendung??Ich könnte in fast alle meine DTOs.

War es hilfreich?

Lösung

Sie sollten BigDecimal verwenden - aber verwenden, um das String-Konstruktor , z.

new BigDecimal("10364055.81");

Wenn Sie eine double zu BigDecimal geben, muss Java erstellen, dass eine doppelte erste - und da verdoppelt werden nicht die meisten Dezimalbrüchen genau darstellen kann, ist es hat den Wert als 10364055.81000000052154064178466796875 erstellen und und leitet es an den Konstruktor BigDecimal. In diesem Fall hat BigDecimal keine Möglichkeit zu wissen, dass Sie die rundere Version tatsächlich gemeint.

Im Allgemeinen nicht-String Konstrukteure von BigDecimal verwenden, sollte eine Warnung in Betracht gezogen werden, dass Sie nicht den vollen Nutzen aus der Klasse zu bekommen.

Bearbeiten - basierend auf rereading genau das, was Sie tun wollten, meine erste Behauptung ist wahrscheinlich zu stark. BigDecimal ist eine gute Wahl, wenn Sie genau Dezimalzahlen darstellen müssen (Umgang mit Geld der offensichtliche Wahl zu sein, Sie 5.99 nicht wollen * eine Million zum Beispiel 5990016.45 werden.

Aber wenn Sie nicht besorgt über die Anzahl sind gespeichert werden intern als sehr leicht unterschiedlichen Wert auf das Dezimalsystem wörtliche Sie eingegeben haben, und wollen ihn nur im gleichen Format erneut drucken, dann wie andere gesagt haben, wird eine Instanz von NumberFormat (in diesem Fall new DecimalFormat("########.##")) gut die doppelten, den Trick tun Ausgabe oder String.format viel das gleiche tun können.

Was die Leistung - BigDecimals wird natürlich langsamer als Primitive verwenden. Typischerweise, obwohl, es sei denn, die überwiegende Mehrheit des Programms mathematische Manipulationen beinhaltet, sind Sie unwahrscheinlich, dass tatsächlich jede Geschwindigkeit Unterschied bemerken. Das ist nicht zu sagen, Sie BigDecimals ganzen verwenden sollten; sondern vielmehr, dass, wenn Sie einen echten Nutzen aus ihren Funktionen erhalten können, die schwierig oder unmöglich sein würden, mit einfachen doubles zu realisieren, dann nicht den winzigen Unterschied in der Leistung schwitzt sie theoretisch vorstellen.

Andere Tipps

Wie man eine Zahl angezeigt wird, verschiedene aus, wie die Nummer gespeichert ist.

Werfen Sie einen Blick auf DecimalFormat für Steuerung, wie können Sie Ihre zahlen, wenn ein double (oder float, etc.).

Beachten Sie, dass die Wahl BigDecimal über das doppelte (oder Umgekehrt) hat vor/Nachteile, und werden von Ihren Anforderungen abhängen.Finden hier für mehr info.Aus der Zusammenfassung:

In Zusammenfassung, wenn raw-Leistung und Raum sind die wichtigsten Faktoren, primitive floating-point-Typen sind geeignet.Wenn Dezimalwerte müssen exakt dargestellt werden, high-Präzision Berechnung notwendig ist, oder Feinabstimmung der Rundung ist gewünscht, nur BigDecimal hat die benötigte Fähigkeiten.

Ein Doppel wäre genug, um diese Nummer zu speichern. Wenn Ihr Problem ist, mögen Sie nicht das Format beim Drucken oder in einen String setzen, könnten Sie Number verwenden: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

Sie verwenden können Doppel- und angezeigt werden, wenn mit System.out.printf ().

double d = 100003.81;
System.out.printf("%.10f", d);

.10f - bedeutet eine doppelte mit einer Genauigkeit von 10

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top