我需要一个可以处理非常大数字但也支持分数的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
有人知道这样的图书馆吗?
答案 0 :(得分:10)
F# PowerPack包含数字类型BigRational
。它是用F#实现的,专为F#设计,但该类型也应该完全可以从C#中使用(包括重载运算符和类似的东西)。 PowerPack是一个具有额外F#功能的附加库,因此它不是.NET框架的一部分,但它是Microsoft支持的产品。
BigRational
类型支持所有基本操作符(+, /, -, *, >, <, >=, <=, ==, !=
),我相信它会自动保持数字的正常形式。如果您将数字表示为两个BigInteger
值,则必须实施比较,以便 1/2 等于 2/4 。
答案 1 :(得分:2)
虽然您可能只想这样做:double d = ((double)i) / ((double)j);
答案 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。 十进制值类型是合适的 用于需要的财务计算 大量的重要积分 和小数位,没有四舍五入 错误。
答案 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。