4

我需要 ac# number 可以处理非常大的数字但也支持分数的东西,我查看了 System.Numerics.BigInteger 进入 .NET 4.0,但我无法让它与分数一起使用。

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

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

4

9 回答 9

10

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

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

于 2010-03-28T18:39:05.227 回答
2

查看http://www.extremeoptimization.com/Documentation/Mathematics/Arbitrary_Precision_Arithmetic/Arbitrary_Precision_Rationals.aspx

虽然也许你只是想这样做:double d = ((double)i) / ((double)j);

于 2010-03-28T18:19:04.190 回答
1

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

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

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

于 2010-03-28T18:23:08.600 回答
1

考虑Decimal类是否足够大:

Decimal 值类型表示从正数 79,228,162,514,264,337,593,543,950,335 到负数 79,228,162,514,264,337,593,543,950,335 的十进制数。Decimal 值类型适用于需要大量有效整数和小数位数且无舍入错误的财务计算。

如果你想变得非常大,那么寻找一个“bignum”库,比如GMP(和 google for bindings)。

于 2010-03-28T18:24:58.963 回答
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;
    }
}
于 2010-03-28T18:23:58.380 回答
0

基于 BigInteger的 BCL Codeplex 中的实验性BigRational

于 2013-04-24T09:05:46.003 回答
-1

BigInteger 支持它在 tin 上所说的内容 - 整数,而分数则不支持。

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

于 2010-03-28T18:19:16.740 回答
-1

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

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

于 2010-03-28T18:59:56.120 回答
-2

i/j 有什么意义吗?它们是类的实例,您需要使用 BigInteger.Divide(i, j)

虽然它被设计为使用整数,所以我应该想象它会丢弃任何余数。如果它确实支持没有函数调用的直接除法,那么这就是你得到 0 的原因。

于 2010-03-28T18:25:05.033 回答