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);
答案 0 :(得分:17)
也许您正在寻找BigRational?微软在CodePlex的BCL项目下发布了它。实际上并不确定它是否符合您的需求。
它将它保持为有理数。您可以通过强制转换或一些乘法来获取带小数值的字符串。
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();
}
}
如果它超出了decimal或double的精度范围,它们将被转换为各自的类型,值为0.0。此外,当结果超出其范围时,转换为十进制将导致抛出OverflowException
。
我编写的扩展方法(可能不是计算分数十进制表示的最佳方法)将准确地将其转换为字符串,具有无限精度。但是,如果数字小于请求的精度,它将返回0.0,就像十进制或双精度一样。
答案 1 :(得分:0)
应该考虑如果存在BigFloat
类型的含义。
BigFloat x = 1.0;
BigFloat y = 3.0;
BigFloat z = x / y;
答案将是0.333333333333333333333333333333333333333333333333333333
重复发生。永远。无穷。内存不足错误。
构造无限BigFloat
很容易。
但是,如果您乐意坚持有理数,则用一个整数除以一个整数来表示,而您可以使用BigInteger
来构建BigRational
类型,该类型可以提供任意精度来表示任意整数实数。
BigRational x = 1;
BigRational y = 3;
BigRational z = x / y;
这有效,并为我们提供了这种类型:
您只需NuGet BigRational
,您会发现许多实现,包括一次从Microsoft获得的实现。