为什么小于等于运算符在 C++ 中对两个“double”值显示意外行为?
Why does the lesser than equal to operator show unexpected behavior for two ```double``` values in C++?
这是我试图解决的问题的link:https://www.codechef.com/problems/HS08TEST
这是一个非常简单的问题,只有三个场景,所以我确信代码会 运行。但是,我得到了错误的答复消息(该网站没有显示出了什么问题)。我的代码如下:
#include<bits/stdc++.h>
using namespace std;
double w, b;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> w >> b;
cout << fixed;
if(fmod(w, 5) == 0.0 && w <= b)
cout << setprecision(2) << (b - w) << "\n";
else
cout << setprecision(2) << b << "\n";
}
被站点标记为正确的解决方案做了一件相当奇怪的事情:
(w+0.5)<=b
他们的说法(没有解释)是如果我们不把 0.5 部分放进去,<= returns 一个 -ve 结果。有人可以解释这里的确切问题是什么吗?
编辑
由于浮点精度问题,建议我加0.5,以便计算机可以进行比较。现在根据数学 a<b
与 a+c<b+c
(不等式)相同。我用那个原理写了(w+0.5)<=(b+0.5)
。然而,即使这样也会给出一个错误的答案信息!使用的代码:
#include<bits/stdc++.h>
using namespace std;
double w, b;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> w >> b;
cout << fixed;
if(fmod(w, 5) == 0.0 && (w+0.5) <= (b+0.5))
cout << setprecision(2) << (b - w) << "\n";
else
cout << setprecision(2) << b << "\n";
}
这是由于一些舍入误差造成的。比较两个浮点数或双精度值时,我们必须考虑精度。例如,如果两个数字是 3.1428 和 3.1415,则它们在精度为 0.01 时是相同的,但不超过该精度,例如 0.001。
您可以获得更多信息here。您还可以搜索舍入误差。
在这个问题中,有一个条件,如“每次成功取款,银行收取 0.50 美元”。如果您的帐户中有 5 美元,则不能提取 5 美元。您可以提取 5$ - 0.50$ = 4.50$ 因为您必须保留 0.05$ 作为交易费用。取款前需要确定您的账户中还留有交易手续费。所以我们必须检查 withdraw + 0.5 <= balance。在这里,交易费为 0.5 美元。 w <= b 或 w + 0.5 <= b + 0.5 会给出错误的答案,因为当你有 5 美元的余额时,你会去提取 5 美元将根据条件接受。没有交易费,就不能取款。所以我们在check的时候要加上withdraw 0.5。另一种方法是 w <= b - 0.5,从账户余额中扣除交易费用。
这是我试图解决的问题的link:https://www.codechef.com/problems/HS08TEST
这是一个非常简单的问题,只有三个场景,所以我确信代码会 运行。但是,我得到了错误的答复消息(该网站没有显示出了什么问题)。我的代码如下:
#include<bits/stdc++.h>
using namespace std;
double w, b;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> w >> b;
cout << fixed;
if(fmod(w, 5) == 0.0 && w <= b)
cout << setprecision(2) << (b - w) << "\n";
else
cout << setprecision(2) << b << "\n";
}
被站点标记为正确的解决方案做了一件相当奇怪的事情:
(w+0.5)<=b
他们的说法(没有解释)是如果我们不把 0.5 部分放进去,<= returns 一个 -ve 结果。有人可以解释这里的确切问题是什么吗?
编辑
由于浮点精度问题,建议我加0.5,以便计算机可以进行比较。现在根据数学 a<b
与 a+c<b+c
(不等式)相同。我用那个原理写了(w+0.5)<=(b+0.5)
。然而,即使这样也会给出一个错误的答案信息!使用的代码:
#include<bits/stdc++.h>
using namespace std;
double w, b;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> w >> b;
cout << fixed;
if(fmod(w, 5) == 0.0 && (w+0.5) <= (b+0.5))
cout << setprecision(2) << (b - w) << "\n";
else
cout << setprecision(2) << b << "\n";
}
这是由于一些舍入误差造成的。比较两个浮点数或双精度值时,我们必须考虑精度。例如,如果两个数字是 3.1428 和 3.1415,则它们在精度为 0.01 时是相同的,但不超过该精度,例如 0.001。 您可以获得更多信息here。您还可以搜索舍入误差。
在这个问题中,有一个条件,如“每次成功取款,银行收取 0.50 美元”。如果您的帐户中有 5 美元,则不能提取 5 美元。您可以提取 5$ - 0.50$ = 4.50$ 因为您必须保留 0.05$ 作为交易费用。取款前需要确定您的账户中还留有交易手续费。所以我们必须检查 withdraw + 0.5 <= balance。在这里,交易费为 0.5 美元。 w <= b 或 w + 0.5 <= b + 0.5 会给出错误的答案,因为当你有 5 美元的余额时,你会去提取 5 美元将根据条件接受。没有交易费,就不能取款。所以我们在check的时候要加上withdraw 0.5。另一种方法是 w <= b - 0.5,从账户余额中扣除交易费用。