C++ 62.0==62.0返回false,为什么?
我遇到了一个我无法解决的恼人问题。我得到了这个代码片段:C++ 62.0==62.0返回false,为什么?,c++,casting,compare,type-conversion,static-cast,C++,Casting,Compare,Type Conversion,Static Cast,我遇到了一个我无法解决的恼人问题。我得到了这个代码片段: LOG(INFO) << "totalTranslation: " << m_move.totalTranslation << " tileSize: " << static_cast<double>(tileSize); if(m_move.totalTranslation >= static_cast<double>(tileSize)) { LOG
LOG(INFO) << "totalTranslation: " << m_move.totalTranslation << " tileSize: " << static_cast<double>(tileSize);
if(m_move.totalTranslation >= static_cast<double>(tileSize)) {
LOG(INFO) << "in!";
}
如您所见,
in代码>仅在totalTranslation大于62时记录。为什么?我认为这可能是强制转换的问题,但我将int
类型的tileSize
强制转换为double
,仍然没有区别。用于比较浮点数之间的相等性,由于计算机中浮点数的内部表示,因此最好查看数字的接近程度。您可能需要检查这些数字之间是否相距epsilon
距离。相等比较的结果取决于特定的编译器/机器
也许你可以看看这个来了解更多的细节:要比较浮点数之间的相等性,最好看数字的接近程度,因为计算机中浮点数的内部表示形式。您可能需要检查这些数字之间是否相距epsilon
距离。相等比较的结果取决于特定的编译器/机器
也许你可以看看这个来了解更多的细节:双倍有时犯了恼人的错误。。。
看起来是62.0,但实际上是61.999999。。。但是当你打印它的时候,它会给你写62。。。
试试这个:
if (62.0 == totalTransaction + 0.01)
do something
有时犯了令人讨厌的错误。。。
看起来是62.0,但实际上是61.999999。。。但是当你打印它的时候,它会给你写62。。。
试试这个:
if (62.0 == totalTransaction + 0.01)
do something
当您检查两个双精度是否相等时,您选择的是正确的方法来计算ε,例如,可接受的裕度
double a = 62;
double b = 62.0000000000001;
double eps = 1e-10;
if (abs(a-b) < eps) {
cout << "match!" << endl;
}
双a=62;
双b=62.0000000000001;
双eps=1e-10;
如果(abs(a-b) cout当你检查两个双精度的相等性时,你是在一条正确的路径上计算ε,例如,可接受的裕度
double a = 62;
double b = 62.0000000000001;
double eps = 1e-10;
if (abs(a-b) < eps) {
cout << "match!" << endl;
}
双a=62;
双b=62.0000000000001;
双eps=1e-10;
如果(abs(a-b) 无法打印更多的yout62
值位数。您正在舍入显示。我认为62可以精确表示,但您的totalTranslation
实际上比62小一点,并且为了打印而舍入。将if更改为fabs(m_move.totalTranslation-static_cast(tileSize))嗯,我不这么认为@sftrabbit,因为当totalTranslation
越小,它的显示就越正确(61.008
)@dziwna-默认精度为打印6位数字。双精度数字有15位左右的小数点位精度。这意味着双精度数字可以略小于62,但打印为62。打印更多位数的yout62
值。您正在舍入显示。我认为62可以精确表示,但您的totalTranslation
实际上是正确的y比62小一点,为了打印而被四舍五入。将if更改为fabs(m_move.totalTranslation-static_cast(tileSize)),我不这么认为@sftrabbit,因为当totalTranslation
小于62时,它会正确显示(61.008
)@dziwna-默认精度为打印6位数字。double有15位左右的小数点精度。这意味着双精度数字可以略小于62,但打印为62。