如何使用 BigDecimal 显示始终有 2 个小数点的数字?

Posted

技术标签:

【中文标题】如何使用 BigDecimal 显示始终有 2 个小数点的数字?【英文标题】:How to display a number with always 2 decimal points using BigDecimal? 【发布时间】:2013-01-25 05:01:19 【问题描述】:

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

例如:

获取的值为 1 - 应显示为 1.00 获取的值为 1.7823 - 应显示为 1.78

我正在使用setScale(2, BigDecimal.ROUND_HALF_UP),但仍有一些地方,如果数据库中的数据是整数,那么会显示相同的数据!!

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

谢谢

【问题讨论】:

我想你可以在这里找到答案:***.com/a/50543/61624 感谢 daniel :) 回复太快了.. 但我已经在使用带有 setscale(2) 的 bigdecimal.round_half_up,当你有 2.12 或 4.2343 之类的数字时它可以工作。当值是像 2 这样的整数时,我希望它显示为 2.00,这就是我失败的地方! How do I format a number in java?的可能重复 【参考方案1】:

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 9 BigDecimal.ROUND_HALF_UP 已被弃用,您现在应该使用 RoundingMode.ROUND_HALF_UP

【讨论】:

自 Java 9 起已弃用,请使用 .setScale(2, RoundingMode.HALF_UP);【参考方案2】:

你可以使用向上取整的格式

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

希望对您有所帮助。

【讨论】:

【参考方案3】:

要在 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)); 

【讨论】:

最好使用new DecimalFormat("##0.00");,因为将##.00 用于0 你会得到.00 而不是0.00【参考方案4】:

您需要使用 NumberFormat 之类的内容,并将适当的语言环境设置为 format

NumberFormat.getCurrencyInstance().format(bigDecimal);

【讨论】:

这将打印货币符号,例如$,以及 OP 没有提到他想要的号码。但就像为了可读性而在这里使用货币实例的想法一样。【参考方案5】:

BigDecimal.setScale 可以工作。

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于如何使用 BigDecimal 显示始终有 2 个小数点的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何格式化小数以始终显示 2 个小数位?

BigDecimal提供了8种舍入方式

格式化 BigDecimal 以使 100 显示为 100 而不是 1.0E+2

怎么让 db2 decimal 四舍五入

如何始终在 R Shiny 的 DataTables 中显示 3 位小数? [关闭]

如何将 Cobol 响应中的签名显示字段解码为 Java 中的 BigDecimal