66

我需要从 中删除尾随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 的自定义转换器中使用它,这对最终用户来说可能很难看。那么,这样做的正确方法是什么?

4

6 回答 6

95

利用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>
于 2013-07-21T09:33:11.183 回答
40

请注意,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());

输出(Java 7):

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

输出(Java 8):

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

Java 7 中的0.0000问题在 Java 8 中由以下java fix 修复

于 2013-09-20T13:09:18.947 回答
9

如果您想在 BigDecimal 对象上执行此操作,而不是使用格式化程序将其转换为字符串,您可以在 Java 8 上通过 2 个步骤执行此操作:

  1. stripTrailingZeros()
  2. if scale < 0 setScale to 0 if don't like esponential/scientific notation

您可以尝试此代码段以更好地理解行为

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
于 2017-11-07T10:22:29.840 回答
5

您也可以使用 来完成此操作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
于 2013-07-21T09:37:49.077 回答
1

您应该对 BigDecimal 进行一些计算,然后将其四舍五入,例如

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

它对我有用。

于 2016-08-10T16:27:37.263 回答
0

您可以使用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

请自己尝试。

于 2017-02-13T08:54:32.740 回答