Java中的BigDecimal出现错误

3
我不断收到以下代码的错误提示:

在类型BigDecimal中,方法add(BigDecimal)不适用于参数(pay)

为了参考,在一个单独的文件中,我保存了pay类,并且也导入了BigDecimal。请问有哪位可以指出我的不足/误解吗?我已经尝试找到解决方案,但是找不到合适的东西。
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
Pay是否在扩展BigDecimal?如果不是,则它将无法正常工作。 - Rene M.
3
pay pay = new pay();这个写法很容易出问题 - 考虑使用Java的命名规范,即将类名首字母大写。这样就应该写成Pay pay = new Pay(); - fvu
最好也贴出支付类的代码,否则很难理解你在这里想要实现什么... - fvu
1
@DougCoats 如果您想添加代码,请更新您的问题。如果您将 pay 重命名为 Pay,请同时更新 SalesPreInt 代码。顺便说一句:您的评论缺少 basePay 方法。(针对其他评论:您无法在评论中格式化代码。这就是为什么您应该将其添加到问题中的原因 ;))。 - Tom
1
你确定吗?使用这个Pay类,SalesPreInit应该会给出完全不同的错误信息 - 例如在这一行 pay.basePay(); - fvu
显示剩余12条评论
2个回答

2
错误信息告诉你,带有一个参数的BigDecimaladd方法需要一个BigDecimal实例:[javaDoc]

public BigDecimal add(BigDecimal augend)

返回一个BigDecimal,其值为(this + augend),其刻度为max(this.scale(), augend.scale())。

参数:
augend - 要添加到此BigDecimal中的值。

返回:
this + augend

你已经将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实例,但你正在将返回值赋给类型为int的变量finalCalc。因此,我们需要将其更改为BigDecimal
BigDecimal finalCalc = salesCom.add(pay.basePay());

现在您的代码已经编译成功,应该能按预期工作了。

啊哈!非常感谢 :3 - Doug Coats

0
如果你想让Pay类返回一个basePay值,你需要一个适当的方法来实现,也就是一个真正返回该值的方法,而不是一个void方法。
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();

由于您想将结果存储为整数,所以

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

请注意,我将值basePay声明为Pay类的私有成员,并将方法重命名以get开头(在Java中称为getter,按照惯例它们的名称以get为前缀)。如果有一天您需要修改该值的方式,请添加一个setter。
public void setBasepay(int bp) {
    basePay = bp;
}

也许你还想直接将存储为int的值设置为BigDecimal?只需添加以下代码:

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

在编程中,具有相同名称但不同参数的两种方法被称为重载,这是一种经常使用的机制,可以在程序中引入灵活性和多样性。

我还建议您查看一个好的教程,Oracle官方教程非常好(而且免费:))


你们太棒了!非常感谢 :D - Doug Coats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接