2013-02-15 5 views
0

У меня есть этот кусок кода, который рассчитывает ежемесячный налог на заработную плату работника. Когда я запускаю его, все работает нормально до точки в условии if.Арифметика В C Не оценивать

Если я поставляю basicSalary как 50000 и все другие входные значения, как 0, то цифра monthlyTax приходит ноль, когда оно должно быть около 4000.

Может кто-нибудь объяснить мне, почему это происходит?

#include <stdio.h> 

int main() 
{ 
    int basicSalary, allowances, transportAllowance, numberOfDependants, deduction; 
    float monthlyTax, income; 

    printf("Enter Basic Salary Amount: "); 
    scanf("%d", &basicSalary); 

    printf("\nEnter Allowances Amount: "); 
    scanf("%d", &allowances); 

    printf("\nEnter transportAllowance Amount: "); 
    scanf("%d", &transportAllowance); 

    printf("\nEnter Number Of Dependants: "); 
    scanf("%d", &numberOfDependants); 

    switch (numberOfDependants) 
    { 
      case 0: 
       deduction = 215000; 
       break; 
      case 1: 
       deduction = 325000; 
       break; 
      case 2: 
       deduction = 415000; 
       break; 
      case 3: 
       deduction = 475000; 
       break; 
      default: 
        printf("Number Of Dependants Can Only Be Between 0 - 3, Enter A Proper Value."); 
        return 1; 
    } 

    income = basicSalary * 13 + allowances + (transportAllowance - 6800) * 12 - deduction; 

    if (income < 500000) 
    { 
     monthlyTax = ((15/100) * (income/12)); 
    } 
    else 
    { 
     monthlyTax = ((15/100) * (500000/12)) + ((30/100) * ((income-500000)/12)); 
    } 

    monthlyTax = monthlyTax/12; 

    printf("\nMothly Tax Amount is %f", monthlyTax); 
    getch(); 

    return 0; 
} 
+3

Это за то, что фантазии и с помощью '15/100' вместо более "заземлены"' 0.15'; -) – dasblinkenlight

+1

И в C это должно быть 'int main (void)' потому что '()' НЕ эквивалентно '(void)' в объявлении параметра. О, и, пожалуйста, прекратите распространять болезнь печати новых строк в начале строки; они принадлежат к концу напечатанной строки. – Jens

+0

Благодарю вас обоих! :) @dasblinkenlight - yup, получилось слишком фантастично: P – Hirvesh

ответ

6

В C, равен 15/1000, потому что это целочисленного деления.

Оригинальный автор, вероятно, означает разделение с плавающей запятой 15.0/100.0.

Вообще говоря, все константы, подразумеваемые при вычислении с плавающей запятой, также должны иметь тип с плавающей точкой (т. Е. Иметь добавленный .0), если вы действительно не знаете, что делаете. Это касается всех чисел, а не только тех, которые находятся в подразделениях, чтобы быть в безопасности.

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

(float)basicSalary ... 

и кстати, многие из переменных, таких как basicSalary, также должны быть типа float.

И как последний совет, рекомендуется по умолчанию использовать double вместо float, если у вас нет конкретной необходимости.

2

Это вызвано целочисленное деление

monthlyTax = ((15/100) * (income/12)); 

Здесь, 15/100 не оценивает до 0,15, а 0 (дробная часть удаляют).

Измените формулы использовать значения с плавающей точкой:

monthlyTax = ((15/100.f) * (income/12.f)); 

или

monthlyTax = ((15/100.0) * (income/12.0)); 
+0

Я не думаю, что '100f' является допустимым выражением C. Вы должны сказать '100.0f'. – rodrigo

+0

@rodrigo: Спасибо, ты был прав. – knittl

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