如何将 BigDecimal 传递给方法?

How to pass a BigDecimal to a method?

这是我的第一个 Java 应用程序。我正在尝试创建产品(键)及其价格(值)的地图。文档说我不能用双打换钱,所以我必须使用 BigDecimal。我现在完全不知道如何在我的方法和地图中使用 BigDecimal。

我只有一种方法可以将产品添加到地图,并且我正在尝试传递 BigDecimal 价格。它不会编译,因为它看到的是字符串而不是 BigDecimal,这让我很困惑,因为 BigDecimal 接受字符串作为参数(例如 BigDecimal example = new BigDecimal("2.50") )

我还想创建一个将价格加到总价中的方法,但不能使用字符串来实现。 BigDecimal 上的文档非常混乱,Google 也不是很有帮助。有人可以解释一下 BigDecimal 以及如何使用它吗?

到目前为止,这是我的代码:

注册class:

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class Register {
    private HashMap<String, BigDecimal> productMap = new HashMap<>();

    public void printProductMap() {
        for(Map.Entry<String, BigDecimal> entry : productMap.entrySet()) {
            String key = entry.getKey();
            BigDecimal value = entry.getValue();
            System.out.println(key + " " + value);
        }
    }

    public HashMap<String, BigDecimal> addProduct(String product, BigDecimal price) {
        BigDecimal productPrice = new BigDecimal(price);
        productMap.put(product, productPrice);
        return productMap;
    }
}

主要class:

public class Main {

    public static void main(String[] args) {

        Register register = new Register();
        register.addProduct("Coffee", "1.25");
        register.addProduct("Cappuccino", "1.50");
        register.printProductMap();
    }
}

检查可用的构造函数here。有一个接受 long 作为参数 (BigDecimal(long val)).

 register.addProduct("Coffee", new BigDecimal(1.25));
 register.addProduct("Cappuccino", new BigDecimal(1.50));

查看@BackSlash 的评论,似乎将 doublefloat 传递给 BigDecimal 可能无法准确处理,因此请改用 BigDecimal(String val)

register.addProduct("Coffee", new BigDecimal("1.25"));
register.addProduct("Cappuccino", new BigDecimal("1.50"));

事实上 BigDecimal 有一个采用 String 的构造函数并不意味着可以将 String 传递给采用 BigDecimal 的方法。

这个问题有两种解决方法:

  • addProduct 的第二个参数的类型更改为 String - 代码将继续编译,因为您在其中构造了 BigDecimal方法,或
  • 为第二个参数传递 new BigDecimal - 调用如下所示:register.addProduct("Coffee", new BigDecimal("1.25"));

第一种方法的更改如下所示:

public HashMap<String, BigDecimal> addProduct(String product, String price) {
    // This is the only change -------------------------------^^^^^^
    BigDecimal productPrice = new BigDecimal(price);
    productMap.put(product, productPrice);
    return productMap;
}

第二种方法的更改如下所示:

public HashMap<String, BigDecimal> addProduct(String product, BigDecimal price) {
    // No need to create productPrice, because price is BigDecimal
    productMap.put(product, price);
    return productMap;
}