2015-06-14 53 views
1

我不断收到的类型误差大小数在Java中

Add方法(BigDecimal)的BigDecimal的不适用的参数(收费)”

错误与下面的代码。

仅供参考我在一个单独的文件,在这里我导入BigDecimal以及保存的pay类。

w ^你们中的一个人是否想指出我缺乏/误解的地方?我试图找到一个解决方案,但我找不到东西。

import java.util.Scanner; 
import java.math.BigDecimal; 

class SalesPreInt { 
    public static void main(String[] args) { 
     Pay pay = new Pay(); 
     pay.basePay(); 

     BigDecimal intCalc = new BigDecimal("0.15"); 

     Scanner userInput = new Scanner(System.in); 

     System.out.println("What were your total sales?"); 
     BigDecimal salesPre = userInput.nextBigDecimal(); 
     System.out.println("You're Total Sales were "+salesPre); 

     userInput.close(); 

     BigDecimal postIntCalc = salesPre.multiply(intCalc); 
     BigDecimal salesCom = postIntCalc.add(salesPre); 
     int finalCalc = salesCom.add(pay); 

     System.out.println("Your total sales including commission is "+salesCom); 
     System.out.println("Your total pay is"+finalCalc); 
    } 
} 

pay.java以下文件:

import java.math.BigDecimal; 

public class Pay { 
    public void basePay() { 
     int basePay = 50000; 
     BigDecimal bd = new BigDecimal(String.valueOf(basePay)); 
    } 
} 
+4

支付扩展BigDecimal?如果没有,它将不起作用 –

+3

'pay pay = new pay();'是一个等待发生的事故 - 考虑使用Java命名约定,即大写类名称。这将使其“支付薪酬=新的薪酬();' – fvu

+0

这是否意味着我必须宣布”支付“为小数位?我以为我在薪酬类文件中是这么做的,或者是不相关的? –

回答

0

像错误消息告诉你了,BigDecimal一个参数的add方法需要BigDecimal例如:javaDoc]

公共BigDecimal的添加(BigDecimal的被加数)

返回BigDecimal,其值是( this + augend),其规模 是max(this.scale(),augend.scale())。

参数:
被加数 - 值将添加到此BigDecimal中。

返回:
这+加数

你已经通过Pay类型的变量,以这种方法,自Pay不是BigDecimal亚型它不涉及到它。方法add无法知道如何添加Pay实例,编译器会抱怨该参数类型。

你可以做以下修补程序,绕过这个问题:

basePay方法创建一个BigDecimal,我想这是您要添加到salesCom,所以改变这种方法有点一:

public BigDecimal basePay() { 
    int basePay = 50000; 
    return new BigDecimal(String.valueOf(basePay)); 
} 

此方法现在创建一个BigDecimal并将其返回给调用方法。现在改变add方法调用使用basePay方法:

int finalCalc = salesCom.add(pay.basePay()); 

现在有只剩一个问题。正如您在上面发布的JavaDoc中看到的那样,add会返回一个新的BigDecimal实例,但您将返回的值分配给变量finalCalc,该变量的类型为int。因此,我们需要将其更改为BigDecimal

BigDecimal finalCalc = salesCom.add(pay.basePay()); 

现在您的代码编译,并预期它应该工作。

+0

AH哈!非常感谢:3 –

0

如果你想薪酬类返回一个basePay值,你需要的是一个适当的方法,即实际返回值的方法,即不是一个无效的方法。

public class Pay { 
    private int basePay = 50000; 

    public BigDecimal getBasepay() { 
     // no need to pass via strings, BigDecimal has a constructor that takes an int value 
     BigDecimal bd = new BigDecimal(basePay); 
     return bd; 
    } 
} 

将被称为像

int finalCalc = salesCom.add(pay.getBasepay()).intValue(); 

,只要你想的结果存储为一个整数,或者说,我宣布basePay

BigDecimal finalCalc = salesCom.add(pay.getBasepay()); 

公告 - 价值 - 作为一家民营Pay类的成员,并将方法重命名为get(在Java中称为getter,并且按照惯例,它们的名称前缀为get)。如果有一天你需要一种方法来修改这个值,只需添加一个setter

public void setBasepay(int bp) { 
    basePay = bp; 
} 

也许你还希望能够直接设置值作为一个BigDecimal尽管它存储为一个int?只需添加

public void setBasepay(BigDecimal bp) { 
    basePay = bp.intValue(); 
} 

两种方法具有相同的名称,但其他的参数被称为重载,这是一种常用的机制引入的灵活性和多功能性在你的程序中。

我也要建议你看看一个很好的教程中,official one by Oracle是相当不错的(而且免费:))

+0

你们摇滚!非常感谢:D –