Jaki jest odpowiednik klasy Java BigDecimal w C#?

BigDecimal jest klasą w pakiecie java.math, która ma wiele zalet do obsługi dużych liczb o określonej skali. Czy istnieje równoważna klasa lub typ danych w c# z tą funkcją.

Author: Nathan Baulch, 2010-05-19

6 answers

C# ma tylko BigInteger wbudowany (w. NET framework 4).

Czy decimal wystarcza precyzja do wykonania zadania? Jest to 128-bitowa liczba, która może pomieścić wartości w zakresie ±1.0 × 10-28 na ±7.9 × 1028.

 25
Author: Dean Harding,
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
2010-05-19 06:48:22

Niedawno też potrzebowałem arbitralnej precyzji dziesiętnej w C# i natknąłem się na pomysł zamieszczony tutaj: https://stackoverflow.com/a/4524254/804614

Następnie ukończyłem szkic, aby obsługiwać wszystkie podstawowe operatory arytmetyczne i porównawcze, a także konwersje do i z wszystkich typowych typów liczbowych i kilka metod wykładniczych, które potrzebowałem w tym czasie.

Z pewnością nie jest kompleksowy, ale bardzo funkcjonalny i prawie gotowy do użycia. Ponieważ jest to wynikiem jednej nocy kodowania, nie mogę zapewnić, że to coś jest wolne od błędów lub całkowicie dokładne, ale to działało świetnie dla mnie. Tak czy siak, chcę go opublikować tutaj, ponieważ nie znalazłem innego sposobu na użycie dowolnych dokładnych dziesiętnych w C# bez konieczności dołączania ogromnych bibliotek (głównie Nie nawet.NET, ale wrapperów do c++), które zawierają wszelkiego rodzaju niepotrzebne rzeczy.

Podstawową ideą jest zbudowanie niestandardowego typu zmiennoprzecinkowego z arbitralnie dużą mantisą przy użyciu typu BigInteger. NET 4.0 oraz wykładnik podstawy 10 (Int32).

Jeśli znajdziesz błędy/nieścisłości, masz sugestie lub cokolwiek konstruktywnego, proszę nie krępuj się bezpośrednio edytować mój post lub zostawić komentarz, więc mogę poprawić odpowiedź.

Nie jestem do końca pewien, czy to jest najlepsze miejsce, aby umieścić to coś, ale jest to jedno z najważniejszych pytań na ten temat i naprawdę chcę podzielić się moim rozwiązaniem. ;)

EDIT: przeniosłem implementację na GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

 39
Author: Gigo,
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-06-25 19:16:46

Cóż, oprócz korzystania z bibliotek innych firm z obsługą BigDecimal (jeśli istnieją), nie ma łatwych obejść. Najprościej, jeśli chodzi o mnie, jest wziąć implementację dziesiętną( na przykład z mono) i przepisać ją za pomocą typu BigInteger. Wewnętrznie, w implementacji mono, Typ dziesiętny składa się z trzech liczb całkowitych. Więc nie sądzę, że byłoby to trudne do wdrożenia. Nie jestem jednak pewien skuteczności. Należy jednak najpierw rozważyć użycie standardowy typ dziesiętny jako codeka .

 4
Author: n535,
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
2010-05-19 07:29:16

Oto biblioteka C#, która robi to, czego szukasz, a w niektórych przypadkach ma dodatkową funkcjonalność: http://www.fractal-landscapes.co.uk/bigint.html (lub spróbuj w http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html).

Na przykład, ma funkcję pierwiastka kwadratowego, której BigDecimal nie ma:

PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN);
BigFloat bf = new BigFloat(13, precision);
bf.Sqrt();
Console.WriteLine(bf.ToString());

Wikipedia ma listę innych tego typu bibliotek na http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

 4
Author: RedGreenCode,
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
2012-09-03 21:16:17

To może nie była opcja, gdy pytanie zostało pierwotnie opublikowane, ale bardzo łatwym sposobem na użycie BigDecimal w kodzie C# jest zainstalowanie IKVM.NET Pakiet via NuGet:

PM> Install-Package IKVM

Następnie rób dokładnie to, co w Javie:

using System;
using java.math;

namespace BigDecimalDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(args[0]);
            Console.WriteLine(Factorial(n));
        }

        static BigDecimal Factorial(int n)
        {
            return n == 1
                ? BigDecimal.ONE
                : Factorial(n - 1).multiply(new BigDecimal(n));
        }
    }
}

W zależności od tego, jak daleko posuniesz się z IKVM, mogą pojawić się sporadyczne problemy z interopem, ale z mojego doświadczenia wynika, że zwykle działa to świetnie w prostych sprawach takich jak ten.

 2
Author: toddprater,
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
2016-01-13 04:45:38

Deveel Math

GitHub:

Https://github.com/deveel/deveel-math

Autor GitHub:

Antonello Provenzano

Wsparcie:

    BigComplex]} BigDecimal]}
  • BigMath
  • Rational
  • ...

Jak go zainstalować

Z konsoli zarządzania pakietami NuGet Wybierz projekt, w którym zostanie zainstalowana biblioteka i wpisz następujące polecenie

PM> Install-Package dmath
 1
Author: TUPUNCO,
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-12-02 09:04:21