Вопрос-ответ

What is the equivalent of the Java BigDecimal class in C#?

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

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

Переведено автоматически
Ответ 1

Совсем недавно мне также понадобилась десятичная дробь произвольной точности в C #, и я наткнулся на идею, опубликованную здесь: https://javalang.ru/a/4524254/804614

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Существует библиотека C # под названием BigNum, которая делает то, что вы ищете, и в некоторых случаях обладает дополнительной функциональностью.

Например, у него есть функция квадратного корня, которой нет у 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

Источники:

c# java