2016-11-06 1 views
0

Я пытаюсь написать простую программу на языке С, которая вводит данные пользователя в метрах и печатает выходные данные в километрах, ярдах и милях округленные до 4 знаков после запятой.Разница в выводе при печати значения, хранящегося в переменной, и значение печати напрямую с помощью printf()

Я использовал этот 1 метр = 0.001 километров = 1,094 ярдов = 0.0006215 миль

Когда я пишу это, я получаю выход по назначению:

#include <stdio.h> 
int main() 
{ 
    int m; 
    float km, y, mi; 
    scanf("%d",&m); 
    km=(m*0.001); 
    y=(m*1.094); 
    mi=(m*0.0006215); 
    printf("%.4f\n%.4f\n%.4f",km,y,mi); 
    return 0; 
} 

Выход:

0,1000

109.4000

0,0622

Но, когда я пишу это я получаю третий выходной неправильно:

#include <stdio.h> 
int main() 
{ 
    int m; 
    scanf("%d",&m); 
    printf("%.4f\n%.4f\n%.4f",(m*0.001),(m*1.094),(m*0.0006215)); 
    return 0; 
} 

Выход:

0,1000

109,4000

0,0621

Можете ли вы помочь мне найти причину этой разницы?


Edit-1

здесь я дал вход 100.

float y=100*0.0006215; 
printf("%f",y); 

дал выход 0.062150

и это

printf("%f",100*0.0006215); 

также дал выход 0.062150


Редактировать-2

float y=100*0.0006215; 
printf("%.4f",y); 

дал выход 0,0622

в то время:

printf("%.4f",100*0.0006215); 

дал выход 0.0621

В то время как в Edit-1 оба отображались на одном выходе.

+0

Я не могу связать «Является ли математика с плавающей запятой?» вопрос с моим вопросом. См. Редактирование. –

ответ

1

Обратите внимание, что 0.001 - это значение double.

В первом примере вы назначены double результата float, отсекая ее значение, которое затем произведено в double при передаче printf.

Во втором примере нет float, результаты double переданы непосредственно на printf.

Также см. Is floating point math broken?.

+0

здесь я дал вход 100: float y = 100 * 0.0006215; \t printf ("% f", y); дал выход 0.062150 и этот printf ("% f", 100 * 0.0006215); также дал результат 0.062150 ** Тогда почему использование «% .4f» в обоих случаях дало другой ответ? ** Я вижу, что вы упомянули, что во втором примере нет float, но я вижу вывод, содержащий 6 знаков после запятой, указывая на float, а не на double. Где я неправ? –

+0

См. Соответствующее редактирование, чтобы лучше понять мой вопрос –

+0

Потому что цифры разные, и они были округлены по-разному. –

Смежные вопросы