gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:58:37 25 4
gpt4 key购买 nike

这显然行不通。

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 是最接近 x/y 的 p 位小数。

有道理吗?

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com