我写了一个程序,计算你必须支付的税,但有些东西我不明白。这可能是一件我不知道的简单事情。
这是我的整个代码:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Type your income and press enter...");
int income = in.nextInt();
int tax, extra;
if (income <= 10000) {
tax = income * (15/100);
System.out.println("The tax you have to pay is " + tax);
} else if (income <= 25000) {
income -= 10000;
tax = income * (20/100) + 1500;
System.out.println("The tax you have to pay is " + tax);
} else if (income <= 58000) {
income -= 25000;
tax = income * (27/100) + 4500;
System.out.println("The tax you have to pay is " + tax);
} else {
income -= 58000;
tax = income * (35/100) + 13410;
System.out.println("The tax you have to pay is " + tax);
}
}
这样程序无法正确计算。例如,如果我写9000,则输出为0.如果我放置3000,则输出为1500.很快,它省略了
income * (20/100)
一部分。因此,我只是删除了它们周围的括号并执行了此操作:
tax = income * 20/100 + 1500;
令人惊讶地发挥了作用。
我的问题只是为什么?我知道在这种情况下括号不是强制性的,但是,我认为用括号书写时可能更容易阅读。为什么我不能使用它们?
答案 0 :(得分:2)
问题在于整数除法不考虑分数。所以20 / 100 == 0
。
在您的具体示例中,由于*
和/
具有相同的优先级并且是左关联的,因此
income * 20 / 100
评估为
(income * 20) / 100
这就是为什么结果看起来是正确的(但事实并非如此,因为对于income <= 5
,您也会获得0
。
只需将其中一个值转换为浮点值,然后将结果转换回来,例如:
(int)(income * (15.0f/100))
答案 1 :(得分:1)
您正在执行整数除法,因为划分两个int
(s)的结果是int
。将一个词设为double
或float
(您也只需要print
一次)。像
double tax;
if (income <= 10000) {
tax = income * (15 / 100.0);
} else if (income <= 25000) {
income -= 10000;
tax = income * (20 / 100.0) + 1500;
} else if (income <= 58000) {
income -= 25000;
tax = income * (27 / 100.0) + 4500;
} else {
income -= 58000;
tax = income * (35 / 100.0) + 13410;
}
System.out.printf("The tax you have to pay is %.2f%n", tax);
答案 2 :(得分:1)
将double用于可变收入和税收。 如果使用20/100,则为整数除法。
要定义百分比,您可以使用0.2表示20%或(20 / 100.0)
答案 3 :(得分:1)
使用括号,您将强制进行整数除法,从而得到0.否则,将首先进行乘法运算,从而导致双重参与除法,从而得到所需的分数。如果您指定其中任何一个常量不是整数(通过添加.0),那么无论是否有括号,结果都是相同的。