c# - 从两个大整数中获取精确的百分比

标签 c# math biginteger

这显然行不通。

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,其中 xy 是大整数。令 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/b10/b100/b ... 等等,直到找到一个值大于x/y。现在您有了上限和下限,您可以对结果空间进行二分搜索,以找到使不等式成立的 a 的准确值。

关于c# - 从两个大整数中获取精确的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982484/

相关文章:

c# - 选中的列表框要求我选择一个项目两次

c# - 如何确定一组值的标准偏差 (stddev)?

用于计算表达式的 Java 算法

Python长乘法

java - 用非常大的数组计算幂集,Java?‽

c# - 字符串的自定义排序

c# - 如何从另一种形式调用函数

c# - MVC 5 多个 HtmlHelper.ValidationSummary 在一页上

math - RSA - p 和 q 的位长

java - 为什么大型 RSA key 不加密为唯一值?