获取 2 个数字之间的差异百分比

Get Percentage Of Difference Between 2 Numbers

本文关键字:百分比 之间 数字 获取      更新时间:2023-10-16

出于某种原因,我对此有问题。

我有 2 个大数 (unsigned long long(,我需要计算 2 之间的百分比差异。

例如,如果第一个是11的,第二个是1313的,则结果应该是+196%的差异。

我尝试了多次计算,但没有一个正常工作。

1(Diff = 100 x ((|A - B|) / ((A + B) / 2))

我一点也不擅长数学,但我查了一下,发现|绝对是A-B。所以我尝试使用math.h中的abs()函数,但它没有明确占用我unsigned long long所以我认为最好不要投射它并弄乱数字,并认为也许我可以传递原始值。这是函数(作为 lambda(:

auto percentageChange = [](unsigned long long Old, unsigned long long New)
-> double
{
double fPer{};
if ((0ul != Old) && (0ul != New))
{
fPer = static_cast<double>(100ul * ((New - Old) / ((New + Old) / 2ul)));
}
return fPer;
};

一些示例结果:

Old = 225194918
New = 225202494
Difference = 0.0%
Old = 0
New = 1421
Difference = 0.0%
Old = 0
New = 6015
Difference = 0.0%
Old = 19874312
New = 20871647015
Difference = 100.0%
Old = 847
New = 876
Difference = 0.0%

它们的打印方式:

printf("Old = %llunNew = %llunDifference = %.1f%%nn", Old, New, fPer);

2(我在geeksforgeeks.org网站上找到了以下内容:

B = New
A = Old
Diff = ((B - A) * 100) / A

这是代码:

auto percentageChange = [](unsigned long long Old, unsigned long long New)
-> double
{
double fPer{};
if ((0ul != Old) && (0ul != New))
{
fPer = static_cast<double>(((New - Old) * 100) / Old);
}
return fPer;
};

以下是它的一些示例结果(当然,所有无符号的长长(:

Old = 225080173
New = 225087090
Difference = 0.0%
Old = 0
New = 968
Difference = 0.0%
Old = 15
New = 5921
Difference = 39373.0%
Old = 22448658
New = 19328478723
Difference = 86000.0%
Old = 847
New = 876
Difference = 3.0%

它们的打印方式:

printf("Old = %llunNew = %llunDifference = %.1f%%nn", Old, New, fPer);

那么,我在哪里搞砸了?我是否以某种方式溢出了整数?我打印错了吗?我搞砸了计算吗?我自己看不到错误。谢谢!

在这一行:

fPer = static_cast<double>(100ul * ((New - Old) / ((New + Old) / 2ul)));

您正在执行整数除法,然后将结果转换为双精度数。请注意,像1/2这样的计算等于0而不是0.5

相反,将最里面的值转换为双精度值,然后所有其他计算将作为浮点计算遵循,如下所示:

fPer = 100ul * ((New - Old) / (static_cast<double>(New + Old) / 2ul));
// innermost value ^^^^^^^^^^^

您提供的两个方程是不同的,因此即使您正确实现了它们,您也会得到两个不同的答案。

通常,当有人说他们想知道的"百分比差异"时,这两个值之间的差异占第一个值的百分比有多大?

  • (B - A( 是差值
  • 为了确定"作为第一个值的百分比",我们求解比例:(B - A(/A = x/100
    • 斧头 = (B - A( * 100
    • x = ((B - A( * 100(/A

这就是你从geeksforgeeks.org那里得到的等式。

如果 A = 5 且 B = 20,则答案是 300,换句话说,B 比 A 大 300%;A 的 300% 是 15,加到 A 得到 20。

我不确定另一个方程在计算什么。您取两个值之间的绝对差值,除以平均值,然后乘以 100。

如果再次 A = 5 且 B = 20,则绝对差为 15,除以 12.5 的平均值得到 1.2,乘以 100 得到 120%。我不明白这如何描述B和A之间的关系。

回到geeksforgeeks.org等式。当 A 大于 B 时会出现问题,因为现在结果是负数,但您使用的是unsigned long long值,因此无法表示负数。如果您有必要处理这种情况,您必须先检查A > B,然后根据 (A - B( 进行数学运算,然后否定结果的符号。

例如,如果 A = 20 且 B = 5,那么我们不能做 (B - A(,所以我们做 (A - B( 给出 15,乘以 100 是 1500,除以 A 是 75,然后否定它,-75。换句话说,B 比 A 少 75%。