在java中使用BigDecimal实现项目的价格

时间:2011-07-30 09:25:49

标签: java bigdecimal

在Web应用程序中,我想建模一个具有价格字段的 ItemForSale 。我在其他地方读到浮点数或双精度不应该用于货币字段,因为舍入错误和BigDecimal是正确的为此目的打字。我创建了这些类

class ItemForSale {
    private String name;
    private BigDecimal price;
    ...
}

class MyUtils{
    ...
    public static BigDecimal parsePriceOfItem(String priceStr){
        BigDecimal price;
        BigDecimal zero = new BigDecimal(0);
        try{
            price = new BigDecimal(priceStr);
        }catch(NumberFormatException nfe){
            price = zero;
        }
        if(price.doubleValue() < zero.doubleValue()){
            price = zero;
        }
        return price;
        }
    }

这是解析价格字符串的正确方法(由用户输入)吗?我想将消极和无效字符串(例如&#39; abcd&#39;)视为0。

如果有更好的方法,请告诉我

感谢

标记

3 个答案:

答案 0 :(得分:4)

为什么要将无效输入视为0?当然,你想告诉用户他们犯了一个错误,而不是把它当作零输入来处理。

如果您正在解析用户输入,那么您可能应该使用DecimalFormat而不是BigDecimal构造函数 - 这样它将使用适当的文化信息。 (使用setParseBigDecimalDecimalFormat解析为BigDecimal而不是double。)

然后使用:

而不是将BigDecimal值转换为double
if (price.compareTo(BigDecimal.ZERO) < 0)

我建议你应该向用户说明三种不同的状态:

  • 无法解析数字
  • 数字为负数(或者可能以其他方式无效;您是否有最大值或最大位数)?
  • 号码有效

答案 1 :(得分:3)

您最昂贵的物品有多贵?如果它低于21,474,836.47美元,您可以安全地将价格表示为正常int的分数。

您是正确的,以避免floatdouble。通常的解决方案是使用intlong来保存分数并相应地调整输出格式。通常没有必要进入BigDecimal的复杂性和速度问题。

答案 2 :(得分:1)

这是我的建议:

public static BigDecimal parsePriceOfItem(String priceStr) {
    try {
        BigDecimal price = new BigDecimal(priceStr);
        return price.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : price;
    } catch(NumberFormatException nfe) {
        return BigDecimal.ZERO;
    }
}