Leichte Java Dezimal-Klasse

stimmen
12

Ich erwäge zwei begrenzte Genauigkeit Alternativen zu BigDecimal schreiben, nämlich DecimalInt und DecimalLong. Dies wäre in der Lage Umgang mit Zahlen innerhalb der realen Grenzen des int und lange mit einer beliebigen Anzahl von Dezimalstellen, creatable sowohl wandelbar und unveränderliche Form. Mein Plan ist DecimalInt Unterstützung +/- 999.999.999 bis +/- 0,999999999 und DecimalLong die gleichen, aber mit bis zu 18 Stellen zu machen.

Dies würde durch die Aufrechterhaltung einer Nachkommastelle Zählwert von 0-9 für DecimalInt und 0-18 für DecimalLong an der Seite getan werden, um die gespeicherten Istwert als skalierte int oder lang. Die normale Nutzung würde für eine kleine Anzahl von Dezimalstellen sein wie für Geld und Aktienkurse, in der Regel 2-4 Dezimalstellen.

Die grundlegenden Anforderungen sind (a) lean Fußabdruck (2 Klassen plus Overflow) und (b) die volle Unterstützung aller Grundoperationen sowie alle Math, die Sinn macht.

hat für die Ergebnisse googeln keine offensichtlichen Hits zurückkehren - sie schienen alle auf beliebige Dezimalstellen zu beziehen.

Meine Fragen sind: Ist dies bereits geschehen? Gibt es in dieser verborgenen Feinheiten, die ist, warum es nicht geschehen? Hat jemand hörte Gerüchte über Java eine Dezimalzahl Typ wie DotNet die Unterstützung.

EDIT: Dies unterscheidet sich von BigDecimal, weil es (a) eine verdammt viel effizienter nicht befassen sich mit einer Reihe von Ints sein sollte, und (b) es wird nicht BigInteger wickeln, so dass es zu schlankeren auf das Gedächtnis sein wird, und (c) es wird eine veränderbare Option hat, so dass es schneller sein als auch dort. Zusammengefasst - weniger Aufwand für die einfachen Anwendungsfälle wie „Ich mag, ohne den Overhead von BigDecimal ein Bankguthaben speichern und der Ungenauigkeit der Doppel“.

EDIT: Ich beabsichtige, auf all die Mathematik zu tun das klassische Problem der Verwendung von int oder lang zu vermeiden: 1.586,60-708,75 = 877,8499999999999 statt 877,85

Veröffentlicht am 09/12/2008 um 21:05
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
12

Ich vermute stark, der Grund, warum dies nicht geschehen ist, dass der Aufwand für BigDecimal und BigInteger nicht so relevant ist, wie Sie denken und es nicht der Mühe wert, und das Risiko des Erhaltens es falsch in einigen subtile Art und Weise vermieden werden.

Um Ihrem Beispiel zu verwenden: für finanzielle Anwendung, ein paar Dutzend Bytes Speichern ist kein Thema und begrenzte Genauigkeit ein Deal-Breaker (Aktienkurse meine typischerweise 2-4 Ziffern in den USA haben, aber wenn Sie wollen, mit den Schwellenländern beschäftigen werden Sie Währungen mit galoppierender Inflation, wo eine 15-stellige Summe kauft man einen halben Laib Brot) begegnen.

Grundsätzlich klingt es wie nur einen weiteren Fall der vorzeitigen Optimierung.

Beantwortet am 11/12/2008 um 11:39
quelle vom benutzer

stimmen
1

Die meisten Menschen, die besonders besorgt über Rundungsfehler verwenden BigDecimal und BigInteger, die in den meisten Situationen gut genug durchführt.

Allerdings ist in dem Leistungs Fall kritische, mit doppelseitigen mit Rundung des Job nicht. Dies wird oft von Anfängern vergessen, aber man kann ohne vernünftige Runde nicht nur ein Doppel Ergebnis nehmen und erwartet, dass eine vernünftige Antwort zu bekommen.

In der überwiegenden Mehrzahl der Fälle mit Runden verdoppelt ist alles, was Sie brauchen.

System.out.printf("%.2f%n", 1586.60-708.75);

Druck

877.85
Beantwortet am 24/11/2010 um 00:03
quelle vom benutzer

stimmen
0

Wenn Sie auf einem festen, kleinen Anzahl von Dezimalstellen für den Umgang mit Geld suchen, dann ist dies in der Regel, indem integer getan (long falls erforderlich) Zahlen von Cent oder Hundertstel Cent.

Wenn Sie mit Geld zu tun, dann müssen Sie, wie vorsichtig sein, die Sie behandeln Runden. Wenn Ihre Berechnungen geprüft werden werden gibt es Regeln, wie diese Art der Sache geschieht. Auch ich nehme an, Sie wissen, dass manche Vorgänge nicht genau durchgeführt werden (Division das offensichtlichste Beispiel ist).

Beantwortet am 10/12/2008 um 15:38
quelle vom benutzer

stimmen
0

Wenn Ihr Fokus für tragbare Geräte zu buchen , ist Echt . Real ermöglicht die Genauigkeit der Zahl von 0 bis 16 eingestellt werden , um es für MIDP-Handys konzipiert.

Ebenfalls von Interesse, Blick auf der konstruktiven Reale Bibliothek. Es ist aber nicht leicht.

In Bezug unten auf den Kommentar, können Sie nicht die Verwendung von Apache Commons Math Library mit Brüchen zu arbeiten? Gibt es einen Grund , die nicht funktionieren?

Beantwortet am 09/12/2008 um 21:31
quelle vom benutzer

stimmen
-1

Es scheint mir, dass, wenn Sie beliebig genau dann wollen Sie eine nicht definierte Anzahl von Bits gehen zu müssen, die Mantisse darstellen. Das bedeutet, dass irgendeine Art von Array-Allocation-Strategie für die Mantisse erforderlich sein wird. Sie könnten Ihre eigene hier Handwerk, aber BigInteger tut es ziemlich effizient und es funktioniert

Sie müssen angeben, was der kleinste (Nicht-Null) Wert, den Sie darstellen müssen, ist. (2 ^ n), wobei n + 1 die Anzahl von Bits, die Sie mit dem Exponenten zuteilen - dies wird 10 ^ sein. Mit BigDecimal ist dies 10 ^ - (2 ^ 31). Sie könnten eine beliebige Größe Exponenten verwenden, aber dieser Bereich sollte für jeden genug sein.

Also, was Sie brauchen, ist eine grenzenlose ganze Zahl Mantisse Sie beliebiger Genauigkeit zu geben, und eine feste Größe Exponent, je nachdem, was Sie Ihre minimalen darstellbaren Wert sein soll. Im Wesentlichen ist dies BigDecimal; die einzige Änderung ist, dass Sie etwas kleineres Objekt eher als die von BigDecimal verwendet int verwenden. Ich würde bezweifeln, ob die Platzersparnis sind es wert. Ich würde denken, dass BigDecimal tun wird, was man fast ohne mehr Speichernutzung benötigen als jede Lösung, die Sie selbst herstellen.

Natürlich können Sie eine maximale Anzahl von signifikanten Zahlen wählen, die Sie benötigen; dann müssen Sie feste Größe Speicher für sowohl Mantisse und Exponent, und das ist eine ganze Menge weniger Speicher. Verwenden Sie einfach eine feste Anzahl von Long-Positionen als Mantisse.

Beantwortet am 09/12/2008 um 23:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more