这显然行不通。
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
如果您想获得最接近的 double ,则可以调用 ToDouble。
I need it accurate to 56 decimal places
好吧,这精度太高了,但我相信你的话。
由于 double 型只有 15 位小数精度,而小数只有 29 位,因此不能使用 double 型或小数型。您必须自己编写代码来进行除法。
这里有两种方法:
首先,编写一个模拟长除法的算法。您可以手工完成,因此您可以编写计算机程序来完成。继续下去,直到生成所需的精度位数。
第二:WOLOG 假设有理数为正,且形式为 x
/y
,其中 x
和 y
是大整数。令 b
为 10p 以获得所需的精度 p
。您希望找到具有以下属性的大整数 a
:
a * y < b * x
和
b * x < (a + 1) * y
a/b
或 (a+1)/b
是 p 位最接近 x/y
的小数。
有道理吗?
您可以通过对非负 BigInteger 集进行二分搜索来找到 a
的值。
要进行二分查找,首先必须找到上限和下限。降低很容易;您知道 0 是下界,因为假设分数 x/y
为正。要查找上限,请尝试 1/b
、10/b
、100/b
... 等等,直到找到一个值大于x/y
。现在您有了上限和下限,您可以对结果空间进行二分搜索,以找到使不等式成立的 a
的准确值。
关于c# - 从两个大整数中获取精确的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982484/