2014-02-01 4 views
2

Я точно не знаю, как, почему выход приходитОбъясните вывод при преобразовании Float в integer?

float f=1.4, t; 
    int d,s; 

    d=(int)f; 
    printf("d=%d\n",d); 
    t=f-d; 
    printf("t=%f\n",t); 
    t=t*10; 
    printf("t=%f\n",t); 
    s=(int)t; 
    printf("s=%d\n",s); 

выход

d=1 
t=0.400000 
t=4.000000 
s=3 

и точно так же, когда f=1.1

выход

d=1 
t=0.100000 
t=1.000000 
s=1 

Является это связано с тем, как целое число и float хранятся в памяти или что-то еще?

+0

Нееет, не снова! Вы, ребята, не можете «непредвиденный результат арифметики с плавающей запятой», можете ли вы ...>. < –

+1

@ H2CO3 Прошу выполнить почетные права на Google, а затем отправить ответ ...спасибо за то, что вы так вежливы :) – Deepu

ответ

4

Вы настроите F = 1.4, а не когда вы

d=(int)f; 

Вы преобразование поплавка в целом, и когда поплавок преобразуются в целое, все номера после периода «» усечены. Теперь д имеет 1 так

t=f-d; 

будет 1,4 - 1 = 0,4

t=t*10; 

т = 0,4 * 10 = 4 и при t- с плавающей точкой, так что выходы 4.0000

Поплавок представляют собой конечные нули в конце

s=(int)t; 

здесь вы снова преобразования с плавающей точкой в ​​целое, Теперь здесь сложная часть, все значения выше ро unded прочь, здесь т имеет значение 3.99999976 так, когда преобразуется в целое число его показывает 3 в результате

Это все потому, что при инициализации т = 1,4, в фактической он инициализируется 1.39999998

1

В ходе первого задания

float f=1.4; 

есть приближение, потому что 1,4 предназначен в качестве двойного (не плавать). Нечто вроде 1.39999999 присваивается f.

Попробуйте использовать

float f=1.4f; 

и он должен работать, как вы ожидаете.

+0

Следует также упомянуть, что printf сначала преобразуется в double (так как это вариационная функция), а затем округляет то, что он печатает, поэтому он показывает 1.400000 – ooga

+0

@ooga printf в этом случае ничего не делает. s содержит 3 из-за описанного нами приближения. – HAL9000

+0

, но когда он печатает t (float), он преобразуется в double перед раундами вызова и printf. – ooga

1

Давайте считать шаг за шагом и посмотреть, как взаимодействуют плавающие точки и int.

Предположим, типичную платформу, где
float является IEEE 754 single-precision binary floating-point format и
double является IEEE 754 double-precision binary floating-point format

float f=1.4, t; 
// 1.4 isn't exactly representable in FP & takes on the closest `double` value of 
// 1.399999999999999911182158029987476766109466552734375 
// which when assigned to a float becomes 
// 1.39999997615814208984375 

int d,s; 
d=(int)f; 
// d gets the truncated value of 1 and prints 1, no surprise. 
printf("d=%d\n",d); 

t=f-d; 
// t gets the value 0.39999997615814208984375 
// A (double) version of t, with the same value is passed to printf() 
// This is printed out, rounded to 6 (default) decimal places after the '.' as 
// 0.400000 
printf("t=%f\n",t); 

t=t*10; 
// t is multiplied by exactly 10 and gets the value 
// 3.9999997615814208984375 
// A (double) version of t, with the same value is passed to printf() 
// which prints out, rounded to 6 decimal places after the '.' as 
// 4.00000. 
printf("t=%f\n",t); 

s=(int)t; 
// s gets the truncated value of 3.9999997615814208984375 
// which is 3 and prints out 3. - A bit of a surprise. 
printf("s=%d\n",s); 
Смежные вопросы