2015-05-24 1 views
0

Я хотел бы придумать поплавок со следующим кодом. change - float, а changeI - int. Сложное входное значение равно 0,41, поскольку оно не может быть точно представлено в двоичном формате, но я не понимаю, почему это не работает.Неизвестное поведение при приведении типа float к int.

changeI = (int)(change*100) 

Если я печатаю только (изменить * 100.0) печатает 41.0000003 или что-то эквивалент, который в моем понимании, если я напечатанный материал т.е. (целое) он должен просто отбросить биты с плавающей запятой и оставить число как 41.

Однако, если я печатаю значение changeI, я получаю 413, и я действительно не знаю почему.

Кроме того, если я вручную напечатать (интермедиат) 41,0000003 он также печатается как 413

Edit:

Ok, так что я нашел главную проблему, которая на самом деле глупо, кстати (я был печати дополнительно 3 раза и забыл новый символ линии в предыдущей печати, но теперь он печатает 40 вместо 41). Это полный код.

int flag = 0; 
float change; 
int changeI; 

do{ 
    printf("How much change is owed?: "); 
    scanf("%f", &change); 
    if (change >= 0){ 
     flag = 1; 
    } 
}while(!flag) 

changeI = (int)(change*100.0); 

printf("%f\n", change*100.0); 
printf("%i\n", changeI); 
printf("%i\n", (int)(41.0000003)); 

Выход на 0,41 является:

>41.0000003 
>40 
>41 

Edit2: Как указан JackV, если скопировать поплавок умноженного на 100, другой поплавок, а затем типаж, что новый поплавок он делает печать 41, но я бы все равно хотелось бы знать, почему это происходит.

+0

Определить 'changeI 'быть' int', а не 'float'. –

+0

changeI is int – Darwin57721

+2

И как вы его печатаете ?? –

ответ

1

Я не знаю точно, что вы делаете, но это:

#include<stdio.h> 

int main() 
{ 
    int changeI, newI; 
    float change = 0.41, var = change * 100; 
    changeI = (int)(change*100); 
    newI = (int)(var); 
    printf("%f", var); //prints 41.000000 
    printf("int = %d\n", changeI); //prints 40 
    printf("float = %f", change); //prints 0.410000 
    printf("%d", newI); //prints 41 
    return 0; 
} 

работает точно так же, как это должно печатает:

Int = 40

поплавок = 0,410000

+0

и почему он печатает 40 вместо 41, если 0,41 * 100 = 41,00 ....? – Darwin57721

+0

@ Darwin57721 Я даже не заметил, что и я не уверен, почему это так, но что я только что редактировал свой пост с чем-то новым, что сработало. Я просто умножил исходный float на 100 и сохранил его в новом float, а затем придумал это значение для int – JackV

+0

Спасибо! Это помогло! но я все равно хотел бы знать, почему это поведение программы. – Darwin57721

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

  • Нет связанных вопросов^_^