Gibt es eine Möglichkeit, eine ‚globale Genauigkeit‘ für alle BigDecimal Berechnungen zu setzen?
Nr
Sie erhalten eine Wrapper-Klasse erstellen müssen, die eine MathContext
als zusätzliches Attribut hat. Es wird benötigt:
Verwendung dieses mc
für jede mathematische Operation, die ansonsten die Standardsemantik verwenden würde, und
erstellen und zurück jedes Mal eine andere umhüllte Instanz der umhüllte Betrieb eine regelmäßige Instanz zurückgibt.
(Als Variante könnte man eine ‚globale‘ MathContext
mit einem statischen implementieren, aber Sie müssen noch wrappering verwenden, um sicherzustellen, dass die mc
verwendet wird.)
(Erweiterung BigDecimal
würde . arbeiten, und das ist diskutierbar ordentlicheres als ein Wrapper-Klasse)
Sie sagte dies in einem Kommentar:
Ich möchte wirklich nicht mein eigenes Dezimal-Modul schreiben, ich möchte nur verstehen, warum BigDecimal so unkooperativ ist.
(Design-Fragen können nur endgültig durch das Design-Team beantwortet. Jedoch ...)
Wie bei allen komplizierten Utility-Klassen, ist das Design von BigDecimal ein Kompromiss, der die erfüllen ist, Anforderungen einer breiten Palette von Anwendungsfällen. Es ist auch ein Kompromiss zwischen den konkurrierenden Meta-Anforderungen (falsches Wort) von "Mächtigkeit" und "Einfachheit".
Was Sie haben, ist ein Anwendungsfall, der nicht besonders gut unterstützt wird. Aber ich vermute, dass, wenn es gut unterstützt wurde (z. B. mit einem globalen MathContext
alles oder eine MathContext
an jedem BigDecimal
angeschlossenen) dann würde das alle Arten von anderen Komplexitäten einführen; z.B. Umgang mit Operationen, bei denen zwei oder mehr konkurrierende Kontextobjekte zu berücksichtigen sind. Solche Probleme könnten angegangen werden ... aber sie können zu "Überraschungen" für den Programmierer führen, und das ist keine gute Sache.
Der aktuelle Ansatz ist einfach und leicht zu verstehen, und wenn Sie etwas komplizierteres benötigen, können Sie es implementieren ... indem Sie explizit einen MathContext
für die Operationen, die es erfordern.
Genau das möchte ich vermeiden. –
Ich habe tatsächlich einige Schwierigkeiten mit der Klassenerweiterung. Wenn ich 2 BigDecimals habe, die "1" und "3" repräsentieren, haben beide eine Skalierung von 120 ... Teilen von "1" durch "3" erzeugt immer noch eine nicht endende Dezimalzahl, auch wenn ich dem Ergebnis eine Skalierung zuteile von 120 auch! (Was ich ursprünglich vermeiden wollte; zusätzliche Parameter für mathematische Operationen). –
Ich denke, dass Sie das beheben können, indem Sie die Divide-Methode für Ihre Klasse ähnlich überschreiben. – trutheality