Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 62.0==62.0返回false,为什么?_C++_Casting_Compare_Type Conversion_Static Cast - Fatal编程技术网

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)无法打印更多的yout
62
值位数。您正在舍入显示。我认为62可以精确表示,但您的
totalTranslation
实际上比62小一点,并且为了打印而舍入。将if更改为
fabs(m_move.totalTranslation-static_cast(tileSize))嗯,我不这么认为@sftrabbit,因为当
totalTranslation
越小,它的显示就越正确(
61.008
)@dziwna-默认精度为打印6位数字。双精度数字有15位左右的小数点位精度。这意味着双精度数字可以略小于62,但打印为62。打印更多位数的yout
62
值。您正在舍入显示。我认为62可以精确表示,但您的
totalTranslation
实际上是正确的y比62小一点,为了打印而被四舍五入。将if更改为
fabs(m_move.totalTranslation-static_cast(tileSize)),我不这么认为@sftrabbit,因为当
totalTranslation
小于62时,它会正确显示(
61.008
)@dziwna-默认精度为打印6位数字。double有15位左右的小数点精度。这意味着双精度数字可以略小于62,但打印为62。