在c ++中奇怪的双重转换行为

use*_*924 3 c++ type-conversion

以下程序显示了我在c ++中看到的奇怪的double to int转换行为:

#include <stdlib.h>
#include <stdio.h>

int main() {
  double d = 33222.221;
  printf("d = %9.9g\n",d);

  d *= 1000;
  int i = (int)d;

  printf("d = %9.9g | i = %d\n",d,i);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行程序时,我看到:

g++ test.cpp
./a.out
d = 33222.221
d =  33222221 | i = 33222220
Run Code Online (Sandbox Code Playgroud)

为什么我不等于33222221?编译器版本是GCC 4.3.0

vir*_*tor 10

浮点表示几乎从不精确(仅在特殊情况下).每个程序员都应该读到:每个计算机科学家应该知道的关于浮点运算的内容

简而言之 - 您的号码可能是33222220.9999999999999999999999999999999999999999999999999999999999999999998(或类似的东西),截断后变为33222220.