支持分数的大数字

时间:2010-03-28 18:15:09

标签: c# numeric

我需要一个可以处理非常大数字但也支持分数的c#编号,我查看了.NET 4.0中的System.Numberics.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

有人知道这样的图书馆吗?

9 个答案:

答案 0 :(得分:10)

F# PowerPack包含数字类型BigRational。它是用F#实现的,专为F#设计,但该类型也应该完全可以从C#中使用(包括重载运算符和类似的东西)。 PowerPack是一个具有额外F#功能的附加库,因此它不是.NET框架的一部分,但它是Microsoft支持的产品。

BigRational类型支持所有基本操作符(+, /, -, *, >, <, >=, <=, ==, !=),我相信它会自动保持数字的正常形式。如果您将数字表示为两个BigInteger值,则必须实施比较,以便 1/2 等于 2/4

答案 1 :(得分:2)

答案 2 :(得分:1)

我曾经使用过这个库: W3b.Sine。它是:

  

任意精度的十进制数   用C#开发的库。

您也可以尝试http://www.fractal-landscapes.co.uk/bigint.html。但是,我没有使用它的经验。

答案 3 :(得分:1)

考虑Decimal类是否足够大:

  

十进制值类型表示   十进制数从正数   79,228,162,514,264,337,593,543,950,335   否定的   79,228,162,514,264,337,593,543,950,335。   十进制值类型是合适的   用于需要的财务计算   大量的重要积分   和小数位,没有四舍五入   错误。

如果你想要真的很大,那就找一个“bignum”库,比如GMP(和google for bindings)。

答案 4 :(得分:0)

这应该给出一个很好的近似值,将两个BigIntegers的有理数转换为double:

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;
    }
}

答案 5 :(得分:0)

基于BigInterger的实验BigRational in BCL Codeplex

答案 6 :(得分:-1)

BigInteger支持它所说的锡整数,而不是分数。

double数据类型支持从±5.0×10 -324 到±1.7×10 308 decimal的二进制浮点数支持从±1.0×10 -28 到±7.9×10 28 的十进制浮点数。 Gabe的回答提到了可用于对分数建模的类,但如果范围足够,则坚持使用原始数据类型。

答案 7 :(得分:-1)

“非常大的数字”的范围是多少?

System.Double.MaxValue = 1.7976931348623157E + 308 ,这对我来说似乎是一个非常大的数字,但是(MSDN Double.MaxValue

答案 8 :(得分:-2)

i / j甚至意味着什么?他们是一个类的实例,你需要使用BigInteger.Divide(i,j)

虽然它设计用于整数,所以我应该想象它会丢掉任何剩余部分。如果它确实支持没有函数调用的直接除法,那就是为什么你得到0。