sprintf等显示函数如何将数字转换为字符串?

时间:2009-02-23 05:46:23

标签: c++ floating-point printf

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

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

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如何得到正确答案?

2 个答案:

答案 0 :(得分:2)

>然而,这里的结果而不是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;

您可能对this感兴趣。

另请参阅modf的{​​{1}}:

math.h

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

答案 1 :(得分:1)

我同意dirkgently使用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);
}