更新: 拥有这些混合要求(即至少显示2位小数,但尽可能多)并不是一件容易实现的事情,但您可以接近实现:
结合 stripTrailingZeros()
和 DecimalFormat
来获得所需的行为(或接近它):
DecimalFormat df = new DecimalFormat("0.00########")
String formatted = df.format(bigDecimal.stripTrailingZeros())
这将格式化任何
BigDecimal
值,小数点后至少有2位数字,并且如果它可以提高精度,小数点后最多有10位数字。
具有
超过小数点后10位数字的
BigDecimal
值仍将被截断:
输入 | 输出
-----------------+----------
1.20000 | 1.20
1.23000 | 1.23
1.2301 | 1.2301
1.230001000 | 1.230001
1.2300000000001 | 1.23
如果你想要保留小数点后两位数字,并确定这样不会失去精度,那么你可以调用
setScale(2, RoundingMode.UNNECESSARY)
方法:
System.out.println(new BigDecimal("1.23000").setScale(2, RoundingMode.UNNECESSARY));
这段代码将会打印出 1.23
。请注意,当需要四舍五入时(即小数点后第三位及以后不为零),会抛出ArithmeticException
异常。
如果你的值可以有更高的精度并且想要进行一些四舍五入,只需将RoundingMode.UNNECESSARY
替换为适当的值:
System.out.println(new BigDecimal("1.2301").setScale(2, RoundingMode.CEILING));
这将打印出
1.24
。
如果您不知道确切的数字位数,但希望尽可能少(即希望
BigDecimal
的
scale
最小),那么调用
stripTrailingZeros()
将完全符合您的要求:
System.out.println(new BigDecimal("1.230001000").stripTrailingZeros();
这将打印1.230001
。
1.230223000
转换为1.230223
,但1.0000
应该打印为1.00
? - Joachim Sauer