具有分数支持的大数

问题描述 投票:4回答:9

我需要一个可以处理非常大的数字但还可以支持分数的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

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

c# numeric
9个回答
1
投票

我曾经使用此库:W3b.Sine。它是:

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

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


10
投票

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

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


2
投票

1
投票

考虑Decimal类是否足够大:

十进制值类型表示十进制数,范围从正数79,228,162,514,264,337,593,543,950,335消极79,228,162,514,264,337,593,543,950,335。十进制值类型合适用于财务计算要求大量有效积分和小数位数,无四舍五入错误。

[如果您想变得更大,请寻找一个[bignum]库,例如GMP(对于bindings,则使用google)。


0
投票

这应该很好地将两个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;
    }
}

0
投票

基于BigInteger的实验性BigRational in BCL Codeplex


-1
投票

[BigInteger仅支持在锡上说的内容-整数,而小数不是。

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


-1
投票

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

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


-2
投票

我/ j甚至还没有什么意思吗?它们是一个类的实例,您需要使用BigInteger.Divide(i,j)

尽管它被设计为与整数一起使用,所以我应该想象它会丢弃任何余数。如果它确实支持不进行函数调用的直接除法,那么为什么您得到0。

© www.soinside.com 2019 - 2024. All rights reserved.