40

我正在使用BigDecimal来获取一些价格值。要求是这样的,无论我们从数据库中获取什么值,显示的值都应该有 2 个小数点。

例如:

提取值为 1 - 应显示为 1.00
提取值为 1.7823 - 应显示为 1.78

我正在使用setScale(2, BigDecimal.ROUND_HALF_UP)但仍有一些地方,如果来自 DB 的数据是整数,则显示相同的数据!

我的意思是如果数据库中的值为 0,则它仅显示为 0。我希望它显示为 0.00

谢谢

4

6 回答 6

62

BigDecimal 是不可变的,包括 setScale(2, BigDecimal.ROUND_HALF_UP) 在内的任何操作都会产生一个新的 BigDecimal。正确的代码应该是

BigDecimal bd = new BigDecimal(1);
bd.setScale(2, BigDecimal.ROUND_HALF_UP); // this does change bd
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(bd);

输出

1.00

注意 - 由于 Java 9BigDecimal.ROUND_HALF_UP已被弃用,您现在应该使用RoundingMode.ROUND_HALF_UP.

于 2013-01-25T05:11:30.557 回答
14

您可以使用向上取整格式

BigDecimal bd = new BigDecimal(2.22222);
System.out.println(bd.setScale(2,BigDecimal.ROUND_UP));

希望这对您有所帮助。

于 2013-01-25T05:20:24.543 回答
8

要在 JAVA 中格式化数字,您可以使用:

 System.out.printf("%1$.2f", d);

其中 d 是您的变量或数字

或者

 DecimalFormat f = new DecimalFormat("##.00");  // this will helps you to always keeps in two decimal places
 System.out.println(f.format(d)); 
于 2013-01-25T05:25:04.613 回答
2

您需要使用NumberFormat适当的语言环境来格式化

NumberFormat.getCurrencyInstance().format(bigDecimal);
于 2013-01-25T05:05:35.897 回答
2

BigDecimal.setScale 会工作。

于 2013-10-21T04:05:16.083 回答
0

下面的代码可能会有所帮助。

protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
    final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
    numberFormat.setGroupingUsed(true);
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);
    return numberFormat.format(input);
}
于 2020-01-27T12:22:42.900 回答