2009-02-23 2 views
1

Я пытаюсь извлечь целые и десятичные части значения с плавающей запятой, и я, кажется, сталкиваюсь с некоторыми странными проблемами округления, из-за, вероятно, из-за неточного способа поплавки.Как функции отображения, такие как sprintf, преобразуют числа в строки?

У меня есть некоторый код, как это извлечь дробную часть:

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

Однако результат здесь вместо 1 выходит как 0. Это, кажется, потому что оригинальный двойной фактически получает хранится как:

2.0099999... 

Однако работает Sprintf кажется, чтобы получить такое преобразование правильно:

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

Как srintf получает правильный ответ, а метод выше?

ответ

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 из math.h:

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

MODF() является лучшей альтернативой, чем делает жонглирование себя.

+0

Спасибо, что указал на мои ошибки, я действительно должен избегать таких вопросов поздно вечером. –

+0

Вы смогли это исправить? – dirkgently

1

Я согласен с dirkgently при использовании modf от math.h. Но если вы должны сделать жонглирование самостоятельно, попробуйте этот код. Это должно решить проблему, которую вы видите.

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); 
} 
+0

Стандарт не определяет _tmain(). – dirkgently

+0

согласен. отредактировал представление. –