2

这显然是行不通的。

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;

你能提出更好的建议吗?

4

1 回答 1

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 位

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

由于双精度只有 15 位小数,而小数只有 29,所以不能使用双精度或小数。您将不得不自己编写代码来进行除法。

这里有两种方法:

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

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

a * y < b * x

b * x < (a + 1) * y

要么 要么a/b(a+1)/bp 位最接近 的小数部分x/y

说得通?

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

要进行二分搜索,首先您必须找到上限和下限。降低很容易;你知道 0 是一个下限,因为假设分数x/y是正数。要找到上界,请尝试1/b, 10/b, 100/b... 等等,直到找到大于 的值x/y。现在您有了一个上限和下限,您可以对结果空间进行二分搜索以找到a使不等式成立的确切值。

于 2013-04-12T23:49:51.987 回答