Java中的大十进制错误

时间:2015-06-14 21:45:32

标签: java bigdecimal

我一直得到

  

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));
    }
}

2 个答案:

答案 0 :(得分: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;
}

也许您还希望能够将值直接设置为BigDecimal,尽管它存储为int?只需添加

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

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

我还建议您查看一个好的教程,official one by Oracle非常好(并且免费:))

答案 1 :(得分:0)

正如错误消息所示,add BigDecimal方法BigDecimal只有一个参数需要Pay个实例:[javaDoc]

  

public BigDecimal add(BigDecimal augend)

     

返回一个BigDecimal,其值为(this + augend),其比例   是max(this.scale(),augend.scale())。

     

<强>参数:
       augend - 要添加到此BigDecimal的值。

     

<强>返回:
       this + augend

您已将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()); 方法:

add

现在只剩下一个问题了。正如您在上面发布的JavaDoc中所看到的,BigDecimal返回一个新的finalCalc实例,但您将返回的值分配给变量int,其类型为BigDecimal }。所以我们需要将其更改为BigDecimal finalCalc = salesCom.add(pay.basePay());

mycookies

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