如何将BigDecimal传递给一个方法?

4

这是我的第一个Java应用程序。我试图创建一个产品(键)和它们的价格(值)映射表。文档说我不能使用double类型表示金额,因此我必须使用BigDecimal类。目前我完全被卡住了,不知道如何在我的方法和映射表中使用BigDecimal。

我只有一个将产品添加到映射表中的方法,并且我正在尝试传递一个BigDecimal类型的价格。但无法编译,因为它看到的是一个字符串而不是BigDecimal类型的参数,这让我感到困惑,因为BigDecimal接受字符串作为参数(例如,BigDecimal example = new BigDecimal("2.50"))。

我还想创建一个方法,将价格添加到总价中,但是你不能使用字符串进行计算。BigDecimal的文档非常令人困惑,Google也没有太大帮助。请问能否有人解释一下BigDecimal以及如何使用它?

这是我目前的代码:

Register类:

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

主类:

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

你应该传入 new BigDecimal()。 - isaace
2个回答

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

非常感谢!我使用了第二种方法,它有效。 - Isoldhe

3

这里查看可用的构造函数。有一个接受长整型参数的构造函数(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"));

2
你应该将值作为字符串传递给 BigDecimal,因为 doublefloat 可能无法精确地保存该值。 - BackSlash

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