从两个大整数中得到精确的百分比

本文关键字:百分比 整数 两个 | 更新日期: 2023-09-27 18:09:10

这显然行不通。

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;

你有更好的建议吗?

从两个大整数中得到精确的百分比

您正在计算一个有理数,而不是整数,因此您应该安装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/y,其中xy是大整数。对于所需的精度p,设b为10p。您希望找到具有

属性的大整数a
a * y < b * x

b * x < (a + 1) * y

a/b(a+1)/b是与x/y最接近的p位小数。

有意义吗?

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

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