从两个大整数中得到精确的百分比
本文关键字:百分比 整数 两个 | 更新日期: 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
,其中x
和y
是大整数。对于所需的精度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
的确切值。