Java 在toString方法中格式化十进制?

Java 在toString方法中格式化十进制?,java,rounding,Java,Rounding,我正在从事一个项目,该项目实现了运费和诸如此类的基本成本,我需要能够格式化toString,以便它以2位小数显示成本。我已经对舍入进行了一些研究,并实现了BigDecimal舍入方法: public static double round(double unrounded, int precision, int roundingMode) { BigDecimal bd = new BigDecimal(unrounded); BigDecimal rounded = bd.se

我正在从事一个项目,该项目实现了运费和诸如此类的基本成本,我需要能够格式化toString,以便它以2位小数显示成本。我已经对舍入进行了一些研究,并实现了BigDecimal舍入方法:

public static double round(double unrounded, int precision, int roundingMode) {
    BigDecimal bd = new BigDecimal(unrounded);
    BigDecimal rounded = bd.setScale(precision, roundingMode);
    return rounded.doubleValue();
}

private double baseCost() {

    double cost = (weightInOunces * costPerOunceInDollars);
    cost = round(cost, 2, BigDecimal.ROUND_HALF_UP);
    return cost;
}

@Override
public String toString() {
    return "From: " + sender + "\n" + "To: " + recipient + "\n"
            + carrier + ": " + weightInOunces + "oz" + ", "
            + baseCost();
}

然而,当它打印出11.50美元的值时,结果是11.5美元。我知道如何在System.out.format()样式中格式化十进制,但我不确定如何将其应用于toString。如何设置格式,使所有小数显示为两个值?我还想知道我是否应该使用BigDecimal,因为这在课堂上还没有介绍过。是否有其他易于实现的舍入方法也可以格式化双精度值的显示?或者我应该在toString方法中格式化十进制数吗

使用
DecimalFormat
double
打印为带两位小数的
字符串

@Override
public String toString() {
    DecimalFormat df = new DecimalFormat("#.00");
    return "From: " + sender + "\n" + "To: " + recipient + "\n"
            + carrier + ": " + weightInOunces + "oz" + ", "
            + df.format(baseCost());
}

您可以在
toString
中应用
DecimalFormat
。关于
BigDecimal
的适当性,如果您处理的是需要精确性的货币,请使用BigDecimal

@Override
public String toString() {

   DecimalFormat format = new DecimalFormat("#.00");

   return "From: " + sender + ... + format.format(baseCost());
}

如果从
round
方法返回
bigdecimic
而不是
double
,则浮点精度不会丢失。

IMHO仅覆盖
toString
用于调试目的。稍微偏离主题,但您应该始终使用
bigdecimic
来获得金钱,而不是double,而不是double,而那种
round()
技术实际上不起作用,因为double没有小数点,它们有二进制位。好的,我实现了DecimalFormat,就像你在toString中说的那样,它工作得很好。但是,我必须将它添加到我的每个子类中,以获得相同的结果,并将值附加到来自超类的toString中。如何在BigDecimal方法中精确设置DecimalFormat的格式?当我尝试这样做时,它给出了一个错误,即当需要一个double时,它被赋予了一个字符串。如果
baseCost
返回一个
BigDecimal
,您可以简单地使用
setScale
。见更新。我实际上设法让它工作。我只是在我的
类(超类)中实现了
BigDecimal
函数,然后在我的两个子类中调用了super方法。但是,我必须在我的
toString
中为每个子类创建一个
DecimalFormat
实例。我一直在寻找一些东西来解决这个问题,但为了这个项目,它只需要发挥作用。谢谢你!