Czy istnieje sposób, aby ustawić „Globalny dokładność” dla wszystkich obliczeń BigDecimal?
nr
Musisz utworzyć klasy otoki, który ma MathContext
jako dodatkowy atrybut. Będzie trzeba:
stosowania tego mc
dla każdej operacji matematycznej, które inaczej byłoby użyć domyślnego semantykę i
tworzyć i za każdym razem, owinięty operacja zwraca instancję regularne powrócić innym owinięty instancji.
(Jako odmianę, można zaimplementować „globalny” MathContext
użyciu statycznej, ale nadal będziesz musiał użyć wrappering aby upewnić się, że mc
jest używany).
(Rozszerzenie BigDecimal
byłoby . działa zbyt, i to jest dyskusyjne neater niż klasy otoki)
Powiedziałeś to w komentarzu:
Naprawdę nie chcę pisać własnego modułu dziesiętnego, chcę tylko zrozumieć, dlaczego BigDecimal jest tak niechętny do współpracy.
(kwestie konstrukcyjne można odpowiedzieć tylko definitywnie przez zespół projektowy. Jednak ...)
jak w przypadku wszystkich skomplikowanych klas użytkowych, projekt BigDecimal jest kompromisem, który został zaprojektowany, aby sprostać wymagania szerokiej gamy zastosowań. Jest to również kompromis pomiędzy konkurującymi meta-wymaganiami (niewłaściwym słowem) "potęgi" i "prostoty".
To, co masz, to przypadek użycia, który nie jest szczególnie dobrze obsługiwany. Ale podejrzewam, że gdyby był dobrze obsługiwany (na przykład globalnym MathContext
kontrolującym wszystko lub MathContext
dołączonym do każdego z nich), wówczas wprowadziłoby to różnego rodzaju inne komplikacje; na przykład obsługa operacji, w których biorą udział dwa lub więcej konkurujących obiektów kontekstowych. Takie problemy można rozwiązać ... ale mogą doprowadzić do "niespodzianek" dla programisty, a to nie jest dobre.
Obecne podejście jest proste i łatwe do zrozumienia, a jeśli potrzebujesz czegoś bardziej skomplikowanego, możesz go wdrożyć ... poprzez jawne dostarczenie MathContext
dla operacji, które tego wymagają.
Dokładnie tego chcę uniknąć. –
W rzeczywistości mam trudności z używaniem rozszerzenia klasy. Jeśli mam 2 BigDecimals reprezentujące "1" i "3", z których oba mają skalę ustawioną na 120 ... Dzielenie "1" przez "3" nadal daje dziesiętny nie kończący się, nawet jeśli przypiszę wynik w skali z 120 również! (To było to, czego początkowo próbowałem uniknąć, dodatkowe parametry do operacji matematycznych). –
Myślę, że możesz to naprawić, zastępując metodę "dziel" w swojej klasie. – trutheality