我需要一个可以处理非常大的数字但还可以支持分数的c#数字,我查看了.NET 4.0中的System.Numerics.BigInteger,但我无法使用它处理分数。
something i = 2;
something j = 5;
something k = i/j; //should be 0.4
当我尝试时
BigInteger i = 2;
BigInteger j = 5;
double d = (double)(i/j); //d is 0.0
有人知道这样的图书馆吗?
我曾经使用此库:W3b.Sine。它是:
任意精度的十进制数用C#开发的库。
您也可以尝试http://www.fractal-landscapes.co.uk/bigint.html。但是,我没有使用它的经验。
F# PowerPack包含数字类型BigRational
。它是在F#中实现的,并且是为F#设计的,但是该类型也应该可以从C#完全使用(包括重载运算符和类似的东西)。 PowerPack是具有附加F#功能的附加库,因此它不是.NET框架的一部分,但它是Microsoft的受支持产品。
BigRational
类型支持所有基本运算符(+, /, -, *, >, <, >=, <=, ==, !=
),我相信它会自动保留数字的常规形式。如果将数字表示为两个BigInteger
值,则必须进行比较,以使1/2等于2/4。
尽管也许您只想这样做:double d = ((double)i) / ((double)j);
这应该很好地将两个BigInteger的有理数转换为双精度:
struct BigRational
{
BigInteger numerator;
BigInteger denominator;
public double ToDouble()
{
BigInteger quotient;
BigInteger remainder;
quotient = BigInteger.DivRem(numerator, denominator, out remainder);
return (double)quotient + (double)remainder / (double)denominator;
}
}
基于BigInteger的实验性BigRational in BCL Codeplex
[BigInteger仅支持在锡上说的内容-整数,而小数不是。
double
数据类型支持从±5.0×10 − 324到±1.7×10 308的二进制浮点数,而decimal
支持从±1.0×10的十进制浮点数-28至±7.9×10 28。 Gabe的答案提到了可用于对分数进行建模的类,但是如果范围足够,请坚持使用原始数据类型。
您的“非常大的数字”的范围是多少?
System.Double.MaxValue = 1.7976931348623157E + 308,对于我来说,这似乎是一个很大的数字,但([MSDN Double.MaxValue)
我/ j甚至还没有什么意思吗?它们是一个类的实例,您需要使用BigInteger.Divide(i,j)
尽管它被设计为与整数一起使用,所以我应该想象它会丢弃任何余数。如果它确实支持不进行函数调用的直接除法,那么为什么您得到0。