c ++分配给int或double的相同计算给出不同的结果,但只针对某些值(c ++中的64.02是一个幻数?)

时间:2017-08-20 02:05:39

标签: c++ casting

我尝试将计算结果分配给变量,然后将其打印出来。但是,根据分配给它的变量的类型,结果会有所不同。但意外结果仅发生在此特定计算的某些值上。

int main() {

    // anything above 64.02 give unexpected results
    // e.g. (100.02 - 100.0) * 100.0

    int a ((64.02 - 64.0) * 100.0); 
    double b ((64.02 - 64.0) * 100.0);

    cout<<"result: "<<a<<endl; // result: 1, expected result: 2
    cout<<"result: "<<b<<endl; // result: 2, expected result: 2

    // anything below 64.02 give right results

    int c ((63.02 - 63.0) * 100.0); 
    double d ((63.02 - 63.0) * 100.0);

    cout<<"result: "<<c<<endl; // result: 2, expected result: 2
    cout<<"result: "<<d<<endl; // result: 2, expected result: 2

    return 0;
}

我知道这个问题非常具体,但我怀疑它与隐式类型转换有关。但为什么只有值> = 64.02?

这是我关于堆栈溢出的第一个问题,请不要-1我!!!

1 个答案:

答案 0 :(得分:1)

64.02表示为浮点实际上是64.01999664306640625。计算后得到1.999664306640625,向下舍入到int时为1。

63.02表示为63.020000457763671875,在计算后给出2,向下舍入为int。

某些数字不能完全以float或double的形式存储。