Reprezentowanie wartości pieniężnych w Javie [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 7 lat temu .

Popraw to pytanie

Rozumiem, że BigDecimal jest zalecaną najlepszą praktyką do reprezentowania wartości pieniężnych w Javie. Czego używasz? Czy istnieje lepsza biblioteka, której wolisz używać zamiast tego?

Author: Elijah, 2008-11-12

14 answers

BigDecimal do końca. Słyszałem, że niektórzy ludzie tworzą własne Cash lub Money klasy, które zawierają wartość pieniężną z walutą, ale pod skórą to nadal BigDecimal, prawdopodobnie z BigDecimal.ROUND_HALF_EVEN zaokrąglanie.

Edit: Jak wspomina Don w swojej odpowiedzi , istnieją projekty open source, takie jak timeandmoney , i chociaż oklaskuję je za próbę uniemożliwienia deweloperom wymyślania koła na nowo, po prostu nie mam wystarczającej pewności w biblioteka pre-alpha do wykorzystania w środowisku produkcyjnym. Poza tym, jeśli kopiesz pod maską, zobaczysz , że używają BigDecimal zbyt .

 82
Author: ninesided,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:29

Może się przydać osobom przybywającym tutaj przez wyszukiwarki, aby dowiedzieć się o JodaMoney: http://www.joda.org/joda-money/.

 52
Author: Iñaki Ibarrola Atxa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 15:07:04

Nie wyrażam tutaj swojej opinii, ale są całkiem dobre argumenty przeciwko BigDecimal, które ktoś powinien chyba wyrzucić:

Http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/

 17
Author: orbfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 21:34:12

Wygodną biblioteką, na którą wpadłem wcześniej, jest biblioteka Joda-Money . Jedna z jego implementacji jest rzeczywiście oparta na BigDecimal. Jest on oparty na specyfikacji ISO-4217 dla walut i może obsługiwać niestandardową listę walut (ładowaną przez CVS).

Ta Biblioteka ma niewielką liczbę plików, które można szybko przejrzeć, jeśli potrzebne są modyfikacje. Joda-Money jest publikowany na licencji Apache 2.0.

 8
Author: Bashar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 15:07:23

Jeśli używasz tylko dolarów i centów, użyłbym długiego (przesunięty o 2 miejsca po przecinku). Jeśli potrzebujesz więcej szczegółów, big decimal może być drogą do zrobienia.

Tak czy siak, pewnie wydłużyłbym klasę, żeby miałatoString (), która używa poprawnego formatu i jako miejsce do umieszczenia innych metod, które mogą się pojawić (przez długi czas mnożenie i dzielenie pójdzie nie tak, jeśli dziesiętny nie zostanie skorygowany)

Ponadto, jeśli używasz define your own class and interface, to możesz zastąpić realizacja do woli.

 7
Author: Bill K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 22:58:48

BigDecimal lub inna reprezentacja stałych punktów jest tym, co jest ogólnie potrzebne dla pieniędzy.

Zmiennoprzecinkowy (Double, Float) reprezentacje i obliczenia są niedokładne, co prowadzi do błędnych wyników.

 3
Author: Ken Gentle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 22:57:40

Trzeba być bardzo ostrożnym, gdy mamy do czynienia z czasem i pieniędzmi.

Kiedy pracujesz z pieniędzmi, mam nadzieję, że każdy powinien wiedzieć, aby nigdy nie używać pływaka lub sobowtóra.

Ale nie jestem pewien co do Bigdecimala.

W większości przypadków będzie dobrze, jeśli po prostu śledzić centów w int lub long. W ten sposób nigdy nie radzisz sobie z miejscem po przecinku.

Wyświetlasz tylko dolary, gdy je drukujesz. Zawsze pracuj z centami wewnętrznymi za pomocą liczb całkowitych. Może to być trudne, jeśli trzeba podzielić albo trzeba użyć matematyki.abs ().

Jednak może Ci zależeć pół centa, a nawet sto centa. Nie wiem, jak to zrobić. Być może będziesz musiał poradzić sobie z tysiącami centów i użyć długiego. A może będziesz zmuszony użyć BigDecimal

Zrobiłbym o wiele więcej czytania na ten temat, ale ignorować wszystkich, którzy zaczynają mówić o użyciu float lub double do reprezentowania pieniędzy. Po prostu proszą o kłopoty.

Czuję, że moja rada nie jest kompletna, więc proszę włożyć w to więcej. Masz do czynienia z niebezpiecznymi typami!

 2
Author: Pyrolistical,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 00:34:13

Tworzenie klasy pieniądza jest drogą do zrobienia. Używając BigDecimal (lub nawet int) pod spodem. Następnie używając klasy waluty do zdefiniowania konwencji zaokrąglania.

Niestety bez przeciążenia Javy przez operatora tworzenie takich podstawowych typów jest dość nieprzyjemne.

 2
Author: Kozyarchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 03:27:00

Jest lepsza biblioteka, timeandmoney . IMO znacznie przewyższa biblioteki dostarczone przez JDK za reprezentowanie tych 2 pojęć.

 2
Author: Dónal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 10:05:15

Zdecydowanie nie BigDecimal. Istnieje tak wiele specjalnych zasad zaokrąglania i prezentacji, o które musisz się martwić.

Martin Fowler zaleca wdrożenie dedykowanej klasy Money do reprezentowania kwot walutowych, a także implementuje Zasady przeliczania walut.

 1
Author: lindelof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 12:43:51

Hej, oto bardzo ciekawy artykuł o Bigdecimalu, i ilustracyjny przykład, dlaczego czasami jest używany zamiast dublerów. BigDecimal Tutorial .

 1
Author: arg20,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-14 21:39:27

Możesz użyć klasy DecimalFormat, gdy ostatecznie wyświetli się wartość waluty. Zapewnia obsługę lokalizacji i jest dość rozszerzalny.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 15:40:57

Zamknąłbym BigDecimal w klasie pieniądza, która również ma walutę, tak jak ktoś wspomniał powyżej. Ważne jest to, że wykonujesz ekstremalną ilość testów jednostkowych, zwłaszcza jeśli pracujesz z różnymi walutami. Jest też dobrym pomysłem, jeśli dodasz wygodny konstruktor, który pobiera ciąg znaków lub metodę fabryczną, która robi to samo, abyś mógł napisać swoje testy coś takiego:

   assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
 0
Author: Per Arneng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 13:19:41

Zawsze są ograniczenia i szczegóły. Każdy, kto nie ma wystarczającego doświadczenia, aby docenić subtelne kwestie opisane w poniższym artykule, powinien poważnie rozważyć zanim zajmie się rzeczywistymi danymi finansowymi: {]}

Http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money

BigDecimal nie jest jedyną poprawną reprezentacją ani jedynym elementem układanki. Pod pewnymi warunkami, przy użyciu klasy pieniądza popartej centami przechowywanymi jako integer mógłby być wystarczający i byłby znacznie szybszy niż BigDecimal. Tak, oznacza to użycie dolarów jako waluty i ogranicza kwoty, ale takie ograniczenia są całkowicie akceptowalne dla wielu przypadków użycia i Wszystkie waluty mają specjalne przypadki zaokrąglania i nominałów, więc nie ma "uniwersalnego" rozwiązania.

 0
Author: Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-23 17:37:08