如何正确显示最高两位小数(美分)的价格,包括Java中的尾随零?

时间:2009-11-14 13:51:43

标签: java double rounding decimal-point

在Java here中舍入小数有一个很好的问题。但我想知道如何在我的程序中包含尾随零来显示价格,如:$ 1.50,$ 1.00

的简单解决方案
String.format("%.2g%n", 0.912385);

工作正常,但如果它在最后一个小数位,则省略尾随零。即使我只使用这样的表达式,问题出现在我的程序中:

double price = 1.50;

当我使用不同的价格(加,乘等)进行计算时,结果主要显示如下:

$2.5000000000000003

因此,使用String.format可以正常工作,但它会将上面的示例截断为

$2.5

是否有正确的方法在第二个小数位显示尾随零?如果计算的输出应为

,则两者都为零
$2.00

5 个答案:

答案 0 :(得分:19)

我建议您这样做:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
double price = 2.50000000000003;
System.out.println(currencyFormatter.format(price));

这具有特定于语言环境的优点。例如,如果您在欧元区而不是美国,这将有效。

答案 1 :(得分:14)

虽然其他人的答案完全有效(尤其是duffymo的答案),但是比格式化显示器有更大的问题。您实际上使用完全错误类型的金额是离散值。您应该考虑使用java.lang.BigDecimal

而不是double

(编辑:......或者在评论中指出duffymo实施良好的Money类,例如JScience的monetary模块中的类或更新的Joda-Money - 仍然有待发布作为正式版。)

答案 2 :(得分:11)

可以使用String.format(...)完成,但您可以使用DecimalFormat

double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50

答案 3 :(得分:4)

你试过了吗?

String s = String.format("$%.2f", 2.50);

这样就可以了。

答案 4 :(得分:0)

public static String getFormattedData(String actualString) 
    {
        String subString = "0.0";

        if(actualString.contains("."))
        {   
            subString = actualString.substring(actualString.indexOf("."), actualString.trim().length()); 

            if(Double.parseDouble(subString) > 0.0)
                return actualString;
            else
                actualString = actualString.substring(0, actualString.indexOf("."));
        }
        return actualString;
    }