1

我正在尝试提取浮点值的整数和小数部分,我似乎遇到了一些奇怪的舍入问题,这可能是由于浮点数的存储方式不精确。

我有一些这样的代码来提取小数部分:

double number = 2.01;
int frac = int(floor(number * 100)) % 100;

然而,这里的结果不是 1,而是 0。这似乎是因为原来的 double 实际上被存储为:

2.0099999...

然而,运行 sprintf 似乎得到了正确的转换:

char num_string[99];
sprintf(num_string,"%f",number);

sprintf 如何在上述方法没有得到正确答案的情况下得到正确答案?

4

2 回答 2

2

> 然而,这里的结果不是 1,而是 1。

你什么意思?

2.099999...

或者,更像2.00999...

正如您所指出的:

int frac = int(floor(number * 100)) % 100;

将会:

int frac = int(floor(2.00999... * 100)) % 100;
         = int(floor(200.999...)) % 100;
         = int(floor(200.999...)) % 100;
         = int(200) % 100;
         = 200 % 100;
         = 0;

您可能对此感兴趣。

另外,请参见modfmath.h

double modf(double x, double *intptr) /* Breaks x into fractional and integer parts. */ 

modf() 是比自己玩杂耍更好的选择。

于 2009-02-23T05:50:51.687 回答
1

我非常同意使用 math.h 中的 modf。但如果你必须自己做杂耍,试试这段代码。这应该可以解决您看到的问题。

int round(double a) {
    if (a > 0)
        return int(a + 0.5);
    else
        return int(a - 0.5);
}

int main()
{
    double number = 2.01;
    int frac = round((number - ((int)number)) * 100);
    printf("%d", frac);
}
于 2009-02-23T06:04:36.910 回答