这显然不起作用。
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;
你能建议更好吗?
答案 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
,其中x
和y
是大整数。设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/b
,10/b
,100/b
...依此类推,直至找到大于x/y
的值。现在你有一个上限和下限,你可以二进制搜索结果空格,找到a
的确切值,使不等式成为真。