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ą.
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.
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
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 .
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
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.
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:
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
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