2013-02-15 72 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 2013-02-15 18:08:00

+1

而在C中,它应该是'int main(void)',因为'()'在参数声明中不等于'(void)'。哦,请停止在行首开始印刷换行的疾病;它们属于打印行的末尾。 – Jens 2013-02-15 18:09:47

+0

谢谢你们俩! :) @dasblinkenlight - yup,太有趣了:P – Hirvesh 2013-02-15 18:11:34

回答

6

在C中,15/100等于0,因为它是整数除法

原作者可能是指浮点除法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 2013-02-15 18:34:39

+0

@ rodrigo:谢谢,你说得对。 – knittl 2013-02-15 19:35:04