2012-08-08 153 views
3

有人可以解释我为什么在C++中发生这样的事情:如果我有为什么trunc(1)输出为0?

double tmp; 
...     // I do some operations with tmp 
         // after which it has to be equal to one 
cout << tmp;   // prints 1 
cout << trunc(tmp); // prints 0 
cout << trunc(tmp*10); // prints 9 

我用这对小数部分例如从数量的分离部分权:5.010 ...我想有0.010 ..所以我使用:

double remainder = tmp - trunc(tmp); 

我张贴整个代码....与地板的建议不工作

short getPrecision(double num, short maxPrecision) { 

    // Retrieve only part right of decimal point 
    double tmp = fabs(num - trunc(num)); 
    double remainder = tmp; 

    // Count number of decimal places 
    int c = 0; 
    while (remainder > 0 && c < maxPrecision) { 
    tmp *= 10; 
    remainder = tmp - trunc(tmp); 
    c++; 
    } 
    return c; 
} 

当运行该功能例如具有5.1 remanider是0而不是1

+0

,你能否告诉我们的操作?因为正如阿门的答案指出的那样,有时双重行动并不准确。 – quasiverse 2012-08-08 09:21:58

+0

尝试在输出值之前将精度设置为17。 '<<'四舍五入(默认为6位精度)。截断和舍入给出不同的结果并不令人惊讶。 – 2012-08-08 09:28:14

+0

或者你可以尝试输出tmp - 1.它看起来像我tmp不一定是1。 – 2012-08-08 09:50:07

回答

6

一些计算它必须是一个后?那么,它可能是0.99999999999999999。浮点运算并不精确,您应该始终考虑到这一点。

+0

那么,0.(9)正好等于1 btw; P – SingerOfTheFall 2012-08-08 12:17:33

+0

@SingerOfTheFall:是的,但前提是有无数个9。但在电脑中,一切都是有限的:P – 2012-08-08 12:23:53

+0

只是在开玩笑;) – SingerOfTheFall 2012-08-08 12:41:19