Есть ли класс BigFloat в C#?
System.Numerics.BigInteger
позволяет умножать большие числа вместе, но что-нибудь такого же типа для чисел с плавающей точкой? Если нет, есть ли бесплатная библиотека, которую я могу использовать?
//this but with floats
System.Numerics.BigInteger maxint = new BigInteger(int.MaxValue);
System.Numerics.BigInteger big = maxint * maxint * maxint;
System.Console.WriteLine(big);
1 ответов
возможно, вы ищите BigRational? Microsoft выпустила его в рамках своего проекта BCL на CodePlex. На самом деле не уверен, как или если это будет соответствовать вашим потребностям.
он сохраняет его как рациональное число. Вы можете получить строку a с десятичным значением либо путем литья, либо путем некоторого умножения.
var r = new BigRational(5000, 3768);
Console.WriteLine((decimal)r);
Console.WriteLine((double)r);
или с простым (ish) методом расширения, как это:
public static class BigRationalExtensions
{
public static string ToDecimalString(this BigRational r, int precision)
{
var fraction = r.GetFractionPart();
// Case where the rational number is a whole number
if(fraction.Numerator == 0 && fraction.Denominator == 1)
{
return r.GetWholePart() + ".0";
}
var adjustedNumerator = (fraction.Numerator
* BigInteger.Pow(10, precision));
var decimalPlaces = adjustedNumerator / fraction.Denominator;
// Case where precision wasn't large enough.
if(decimalPlaces == 0)
{
return "0.0";
}
// Give it the capacity for around what we should need for
// the whole part and total precision
// (this is kinda sloppy, but does the trick)
var sb = new StringBuilder(precision + r.ToString().Length);
bool noMoreTrailingZeros = false;
for (int i = precision; i > 0; i--)
{
if(!noMoreTrailingZeros)
{
if ((decimalPlaces%10) == 0)
{
decimalPlaces = decimalPlaces/10;
continue;
}
noMoreTrailingZeros = true;
}
// Add the right most decimal to the string
sb.Insert(0, decimalPlaces%10);
decimalPlaces = decimalPlaces/10;
}
// Insert the whole part and decimal
sb.Insert(0, ".");
sb.Insert(0, r.GetWholePart());
return sb.ToString();
}
}
если оно из ряда точности десятичного или двойного, то они будут приведите к их соответствующим типам со значением 0.0. Кроме того, приведение к decimal, когда результат находится вне его диапазона, вызовет OverflowException
быть брошенным.
метод расширения, который я написал (который не может быть лучшие способ вычисления десятичного представления дроби) точно преобразует его в строку с неограниченной точностью. Однако, если число меньше запрошенной точности, оно вернет 0.0, как и decimal или double.