Подтвердить что ты не робот

Что эквивалентно классу Java BigDecimal в С#?

BigDecimal - это класс в пакете java.math, который имеет много преимуществ для обработки больших чисел определенного масштаба. Есть ли эквивалентный класс или тип данных в С# с этой функцией.

4b9b3361

Ответ 1

С# только имеет BigInteger встроенный (в .NET framework 4).

Является ли decimal достаточной точностью для вашей задачи? Это 128-битное число, которое может хранить значения в диапазоне ± 1,0 × 10 -28 до ± 7.9 × 10 28.

Ответ 2

Совсем недавно я также нуждался в произвольной точности десятичных чисел в С# и наткнулся на идею, размещенную здесь: fooobar.com/questions/138246/...

Затем я завершил проект, чтобы поддержать все основные операторы арифметики и сравнения, а также преобразования и из всех типичных числовых типов и несколько экспоненциальных методов, которые мне в то время нужны.

Это, безусловно, не является всеобъемлющим, но очень функциональным и почти готовым к использованию. Поскольку это результат одного ночного кодирования, я не могу гарантировать, что эта вещь является ошибкой или полностью точной, но она отлично поработала для меня. Во всяком случае, я хочу опубликовать его здесь, потому что я не нашел другого способа использовать произвольные десятичные значения точности в С# без необходимости включать массивные библиотеки (в основном даже не.net, а wrappers на c++), которые бывают всех видов ненужных вещей.

Основная идея заключается в создании пользовательского типа с плавающей запятой с произвольной большой мантиссой с использованием типа BigInteger.NET 4.0 и базового показателя 10 (Int32).

Если вы обнаружите ошибки/неточности, имеете предложения или что-либо конструктивное, пожалуйста, не стесняйтесь прямо редактировать мое сообщение или оставлять комментарий, чтобы я мог улучшить ответ.

Я не совсем уверен, что это лучшее место для размещения этой вещи, но это один из главных вопросов по этой теме, и я действительно хочу поделиться своим решением. ;)

EDIT: я переместил реализацию в GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

Ответ 3

Ну, кроме использования сторонних библиотек с поддержкой BigDecimal (если они существуют), нет простых способов обхода. Самый простой способ, насколько мне известно, - выполнить десятичную реализацию (например, с моно) и переписать ее с помощью типа BigInteger. Внутренне, в моно реализации, десятичный тип состоит из трех целых чисел. Поэтому я не думаю, что это было бы трудно реализовать. Однако я не уверен в эффективности. Сначала вам следует рассмотреть возможность использования стандартного десятичного типа в качестве codeka.

Ответ 4

Здесь библиотека С#, которая делает то, что вы ищете, и в некоторых случаях имеет дополнительную функциональность: http://www.fractal-landscapes.co.uk/bigint.html (или попробуйте на http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html).

Например, он имеет функцию квадратного корня, которую BigDecimal не имеет:

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

В Википедии есть список других таких библиотек на http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

Ответ 5

Возможно, это был не вариант, когда вопрос был первоначально отправлен, но один очень простой способ использовать BigDecimal в коде С# - установить IKVM.NET через NuGet:

PM> Install-Package IKVM

Затем выполните то же, что и в Java:

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));
        }
    }
}

В зависимости от того, как далеко вы продвигаетесь с IKVM, может возникать случайная проблема взаимодействия, но, по моему опыту, она обычно отлично подходит для простых вещей, подобных этому.

Ответ 6

Девель Математика

GitHub:

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

Автор GitHub:

Антонелло Провенцано

Поддержка:

  • BigComplex
  • BigDecimal
  • BigMath
  • Rational
  • ...

Как установить его

В консоли управления пакетами NuGet выберите проект, в котором будет установлена ​​библиотека, и введите следующую команду

PM> Install-Package dmath

Ответ 7

Вы также можете использовать пакет NuGet Math.Gmp.Native, который я написал. Его исходный код доступен на GitHub, а документация доступна здесь. Он предоставляет .NET всю функциональность библиотеки GMP, которая известна как высоко оптимизированная арифметическая библиотека произвольной точности.

Числа с плавающей точкой произвольной точности представлены типом mpf_t. Все операции над этими числами с плавающей точкой начинаются с префикса mpf_. Например, mpf_add или mpf_cmp. Примеры исходного кода приведены для каждой операции.