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

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

6 ответов

Решение

C# имеет только BigInteger построил его (в.NET Framework 4).

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

Совсем недавно мне также потребовалась произвольная десятичная точность в C#, и я наткнулся на идею, размещенную здесь: /questions/13930442/proizvolnaya-tochnost-desyatichnyih-drobej-v-c/13930467#13930467

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

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

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

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

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

РЕДАКТИРОВАТЬ: я переместил реализацию в GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

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

Вот библиотека C#, которая делает то, что вы ищете, и в некоторых случаях имеет дополнительную функциональность: 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

Deveel Math

GitHub:

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

Автор GitHub:

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

Служба поддержки:

  • BigComplex
  • BigDecimal
  • BigMath
  • рациональный
  • ...

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

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

PM> Install-Package dmath

Это, возможно, не было вариантом, когда вопрос был первоначально опубликован, но один действительно простой способ использовать BigDecimal в вашем коде C# для установки пакета 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, может возникнуть случайная проблема с взаимодействием, но, по моему опыту, она отлично работает для таких простых вещей, как эта.

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

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

Другие вопросы по тегам