在Java中使用括号进行计算

时间:2015-01-19 00:14:17

标签: java parentheses

我写了一个程序,计算你必须支付的税,但有些东西我不明白。这可能是一件我不知道的简单事情。

这是我的整个代码:

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;

令人惊讶地发挥了作用。

我的问题只是为什么?我知道在这种情况下括号不是强制性的,但是,我认为用括号书写时可能更容易阅读。为什么我不能使用它们?

4 个答案:

答案 0 :(得分:2)

问题在于整数除法不考虑分数。所以20 / 100 == 0

在您的具体示例中,由于*/具有相同的优先级并且是左关联的,因此

 income * 20 / 100

评估为

(income * 20) / 100

这就是为什么结果看起来是正确的(但事实并非如此,因为对于income <= 5,您也会获得0

只需将其中一个值转换为浮点值,然后将结果转换回来,例如:

(int)(income * (15.0f/100))

答案 1 :(得分:1)

您正在执行整数除法,因为划分两个int(s)的结果是int。将一个词设为doublefloat(您也只需要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),那么无论是否有括号,结果都是相同的。