在 Java 中使用括号进行计算

Using parenthesis for calculation in Java

我编写了一个程序来计算您必须支付的税款,但有些地方我不明白。这可能是我不知道的简单事情。

这是我的全部代码:

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;

令人惊讶的是它奏效了。

我的问题很简单,为什么?我知道在这种情况下括号不是必须的,但是,我认为写在括号中会更容易阅读。为什么我不能使用它们?

您正在执行整数除法,因为除以两个 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);

问题是整数除法不考虑小数。所以 20 / 100 == 0.

在您的具体示例中,由于 */ 具有相同的优先级并且是左结合的

 income * 20 / 100

被评估为

(income * 20) / 100

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

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

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

对可变收入和税收使用 double。 如果您使用 20/100 ,它是一个整数除法。

要定义百分比,您可以使用 0.2 表示 20% 或 (20/100.0)

使用括号,您将强制进行整数除法,结果为 0。没有括号,将首先执行乘法,导致双精度参与除法,从而得到所需的分数。如果您指定其中一个常量不是整数(通过添加 .0),则无论有没有括号,结果都是一样的。