从两个Big Integers获得精确的百分比

时间:2013-04-12 23:35:52

标签: c# math biginteger

这显然不起作用。

BigInteger Total = 1000000000000000000000000000000000000000000000000000022234235423534543;
BigInteger Actual = 83450348250384508349058934085;
string Percent = ((Decimal)100.0/Total*Actual).ToString()+"%";

问题是,如何获得精确的百分比?

目前我使用..

        string sTotal = (task.End - task.Start).ToString();
        BigInteger current = task.End;

                string sCurrent = (task.End-current).ToString().PadLeft(sTotal.Length, '0');
                Int32 maxLength = sCurrent.Length;
                if (maxLength > Int64.MaxValue.ToString().Length - 1)
                    maxLength = Int64.MaxValue.ToString().Length - 1;

                UInt64 currentI = Convert.ToUInt64(sCurrent.Substring(0, maxLength));
                UInt64 totalI = Convert.ToUInt64(sTotal.Substring(0, maxLength));

                Percent = (Decimal)100.0 / totalI
                    * currentI;

你能建议更好吗?

1 个答案:

答案 0 :(得分:4)

您计算的是理性而非整数,因此您应该安装Solver Foundation:

http://msdn.microsoft.com/en-us/library/ff524509(v=VS.93).aspx

并使用Rational而不是BigInteger:

http://msdn.microsoft.com/en-us/library/ff526610(v=vs.93).aspx

如果你想将理性值作为最接近的双精度,你可以调用ToDouble。

  

我需要它精确到小数点后56位

好的,这是一个荒谬的精确度,但我会接受你的话。

由于double只有15位小数的精度而小数只有29位,所以不能使用double或decimal。你将不得不自己编写代码来进行划分。

以下是两种方法:

首先,编写一个模拟进行长除法的算法。你可以手工完成,这样你就可以编写一个计算机程序来完成它。继续,直到生成所需的精度位数。

第二:WOLOG假设所讨论的理性是正面的,其形式为x / y,其中xy是大整数。设b为10 p ,得到所需的精度p。您希望找到具有以下属性的大整数a

a * y < b * x

b * x < (a + 1) * y

a/b(a+1)/b是小数部分,p位数最接近x/y

有意义吗?

您可以通过对非负BigIntegers集进行二进制搜索来找到a的值。

要进行二分查找,首先必须找到上限和下限。降低很容易;你知道0是一个下限,因为假设分数x/y是正数。要查找上限,请尝试1/b10/b100/b ...依此类推,直至找到大于x/y的值。现在你有一个上限和下限,你可以二进制搜索结果空格,找到a的确切值,使不等式成为真。