2013-06-04 5 views
0

В следующей простой кусок кода, когда я задаю dearness=(40*basic)/100 or rent=(20*basic)/100 он работает нормально, однако протекающие в моде следующим образом, операторы присваивания для дороговизны и аренды не имеют никакого эффектаошибка в простом операторе присваивания в C

Пожалуйста, предполагающих возможные причины.

#include "stdio.h" 
#include "conio.h" 

int main() 
{ 
    int salary=0,basic=0,dearness=0,rent=0; 
    clrscr(); 
    printf("enter basic salary"); 
    scanf("%d",&basic); 
    dearness=(40/100)*basic; //no effect 
    rent=(20/100)*basic; //no effect 
    salary=basic+dearness+rent; 
    printf("%d %d",dearness,rent); 
    printf("\n%d",salary); 
    getch(); 
    return 0; 
} 

спасибо.

+0

Может быть, вы хотели бы иметь прочитать это: http://stackoverflow.com/questions/3602827/what-is-the-behavior-of-integer-division-in-c – Nobilis

ответ

1

В целочисленном делении, как 40/100 и 20/100 приводит к нулю, так как целые числа могут не между 0 и 1. (на самом деле, это определение целого: оно не может быть между целыми числами)

Следовательно, утверждение:

(40/100)*basic; 

сводится к:

0*basic; 

, которая равна нулю.


Решения либо сделать расчет в терке или двойной или, если вы все еще хотите использовать целые числа, убедитесь, что вы разделите после умножения:

(40*basic)/100; 

примечания: Есть случаи, когда вам хочу сделать это. Например, для точных финансовых расчетов нецелесообразно использовать поплавки или парные разряды, потому что они не ведут себя так, как вы ожидали бы десятичных чисел. Таким образом, вы сделали бы расчет в соответствии с вышеизложенным (всегда занимая деление последним) и используйте %, чтобы найти значение центов. Обработка сигналов - это еще одна область, где вы будете иметь дело в основном с целыми числами, хотя бы потому, что обычно используемые процессоры не поддерживают операции с плавающей запятой в аппаратном обеспечении.

+0

А, да. Нужно перефразировать это. – slebetman

6

Это потому, что 40/100 имеет целочисленный результат (поскольку оба операнда являются целыми числами) и, следовательно, равен 0. Вам необходимо использовать число с плавающей запятой вместо хотя бы одного из операндов, а затем вернуть результат обратно в int:

dearness = (int)((40/100.0) * basic); 

или просто:

dearness = (0.4 * basic); 

Другой вариант, который вы нашли себя в этом вопросе, будет выполнять деление последнего. Таким образом, вы деления большего числа на 100, вместо того, чтобы сразу получить результат 0:

dearness = 40 * basic/100; 

Когда переменные участвуют также можно сделать явное приведение типа:

dearness = ((double)foo/bar) * basic; 

Имейте в виду, что каждый операнд в расчете продвигается к самому большому типу в нем (упрощенному), поэтому, если у вас есть int + double,будет преобразован в double перед выполнением добавления. Но если все операнды совпадают по типу, расчет будет выполнен в этом типе, и результат будет следующим. Обычно это не проблема, но с делением она часто встречает интуицию большинству людей, потому что в некоторых случаях они неожиданно получают 0 (как и вы).

2

Использование double результатов в

double dearness, rent, salary; 

dearness=(40.0/100)*basic; 
rent=(20.0/100)*basic; 
salary=basic+dearness+rent; 
... 

Как все в 40/100 это целое возвращает 0 как целое и, следовательно, результат 0. Вы хотите 0.4.

+0

Технически, вы использовали 'double'; вам нужно написать '40.0F' и' 20.0F', чтобы использовать 'float'. –

+0

@JonathanLeffler, спасибо, обновлено. – Rohan

2

В заявлении dearness=(40/100)*basic;, 40/100 = 0, поскольку оно является целым делением. Сделайте это dearness=(40.0/100)*basic.

2

Если оба оператора в операции деления являются целыми, он называется целым делением и результат усекается.

См: What is the behavior of integer division?

В коде

dearness=(40/100)*basic; //no effect 
rent=(20/100)*basic; //no effect 

, так как операторы представляют собой целые числа, а результат меньше, чем один, выход усекается до 0 для этого разделения. Сделать любой из них или их обоих с плавающей запятой даст правильные результаты.

dearness=(40/100.0)*basic; //effective 
rent=(20.0/100)*basic; //effective 
Смежные вопросы