int变量被连接而不是在System.out.println()中添加

时间:2016-10-17 07:45:56

标签: java string

为什么total_amounttax_amount作为字符串连接在一起而不是在下面的println语句中作为数字加在一起?

public class Test{

  int total_amount,tax_amount;
  public void cal(int total_amount,int tax_amount)
 {
     System.out.println("Total amount : "+total_amount+tax_amount);
 }
  public static void main(String[] args) {
  new Test().cal(100, 20);
  }

}

Output Total amount : 10020
Expected Total amount : 120

3 个答案:

答案 0 :(得分:16)

那是因为运营商的优先权。基本上,您的代码与以下内容相同:

System.out.println(("Total amount : " + total_amount) + tax_amount);

因此当total_amount为100且tax_amount为20时,最终会:

System.out.println(("Total amount : " + 100) + 20);

评估为:

System.out.println("Total amount : 100" + 20);

评估为:

System.out.println("Total amount : 10020");

选项:

  • 使用括号显示您希望如何对操作进行分组:

    System.out.println("Total amount : " + (total_amount + tax_amount));
    
  • 首先执行求和,并将其存储在新变量中:

    int totalIncludingTax = total_amount + tax_amount;
    System.out.println("Total amount : " + totalIncludingTax);
    

作为旁注,我建议:

  • 遵循Java命名约定,使用camelCase而不是underscores_separating_words,例如taxAmount代替tax_amount
  • 更仔细地命名变量 - 拥有一个名为total_amount的变量但是然后使用标签Total amount
  • 打印不同的内容很奇怪
  • 在此处使用静态方法,因为您实际上并未使用对象中的字段。 (这些字段令人困惑,因为你没有使用它们。)

使用代码格式化,您最终得到:

public class Test {
    public static void main(String[] args) {
        calculateTotal(100, 20);
    }

    private static void calculateTotal(int preTaxTotal, int tax) {
        int totalIncludingTax = preTaxTotal + tax;
        System.out.println("Total amount: " + totalIncludingTax);
    }
}

(你还应该考虑你要为非整数价格做些什么...我建议使用整数,但要使用美分/便士数/或者使用BigDeciml代表价格。)

答案 1 :(得分:3)

Java假定您希望将值连接为字符串。您可以使用括号来阻止这种情况:

System.out.println("Total amount : "+ (total_amount + tax_amount));

添加括号会在连接加法结果和"Total amount :"字符串之前添加两个值。

答案 2 :(得分:2)

这样做

System.out.println("Total amount : "+total_amount+tax_amount);

与打印相同

字符串文字后面的 total_amount tax_amount 的串联总金额:

因此没有进行数学运算

total_amount保持值100和 tax_amount 20因此输出 10020

改为

 System.out.println("Total amount : " + (total_amount + tax_amount));