在 Java 中从 BigDecimal 中移除尾随零

我需要从 BigDecimalRoundingMode.HALF_UP中移除尾随零。例如,

Value        Output


15.3456  <=> 15.35
15.999   <=> 16            //No trailing zeros.
15.99    <=> 15.99
15.0051  <=> 15.01
15.0001  <=> 15           //No trailing zeros.
15.000000<=> 15           //No trailing zeros.
15.00    <=> 15           //No trailing zeros.

stripTrailingZeros() 可以工作,但它会在以下情况下返回科学符号:

new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();

在本例中,它返回 6E+2。我需要在 JSF 中的自定义转换器中使用它,因为它对于最终用户来说可能很难看。那么,正确的做法是什么呢?

74018 次浏览

使用 toPlainString()

BigDecimal d = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
System.out.println(d.toPlainString()); // Printed 600 for me

我还不喜欢 JSF,但是转换器可能是这样的:

@FacesConverter("bigDecimalPlainDisplay")
public class BigDecimalDisplayConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
throw new BigDecimal(value);
}


@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
BigDecimal  bd = (BigDecimal)value;
return bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
}
}

然后是 xhtml:

<h:inputText id="bigDecimalView" value="#{bigDecimalObject}"
size="20" required="true" label="Value">
<f:converter converterId="bigDecimalPlainDisplay" />
</h:inputText>

您也可以使用 String.format()来完成这项工作,如下所示:

final BigDecimal b = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP);
String f = String.format("%.0f", b);
System.out.println(f); //600

请注意,stripTrailingZeros()的表现也不是很好。

关于这一点:

val = new BigDecimal("0.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());


val = new BigDecimal("40.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());


val = new BigDecimal("40.50000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

输出(Java7) :

0.0000: plain=0.0000
4E+1: plain=40
40.5: plain=40.5

输出(Java8) :

0: plain=0
4E+1: plain=40
40.5: plain=40.5

Java7中的 0.0000问题在 Java8中由以下 爪哇修复修复。

你应该对 BigDecimal 做一些计算,然后四舍五入它的一半。

    BigDecimal toPay = new BigDecimal(1453.00005);
toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)

这招对我很管用。

你可以使用 DecimalFormat 十进制格式。 例如:

BigDecimal value = new BigDecimal("15.3456").setScale(2, BigDecimal.ROUND_HALF_UP));
String valueString = new DecimalFormat("#.##").format(value);
System.out.println(valueString); //15.35

你自己试试吧。

如果您想在 BigDecimal 对象上执行此操作,而不是使用格式化程序将其转换为 String,那么您可以在 Java8上执行此操作,步骤分为两步:

  1. StripTrailingZero ()
  2. 如果刻度 < 0 setScale 到0如果不喜欢科学记数法

您可以尝试使用这个代码片段来更好地理解行为

BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50.2
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//5E+1
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//50.2