获取 2 个数字之间的差异百分比
Get Percentage Of Difference Between 2 Numbers
出于某种原因,我对此有问题。
我有 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%。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 获取 2 个数字之间的差异百分比
- 就百分比而言,这两种方法之间的平均性能差异有多大
- 查找向量C++中变量之间的百分比差异
- 两个字符串之间的相似性百分比