在Java中从BigDecimal中删除尾随零

在Java中从BigDecimal中删除尾随零,java,bigdecimal,Java,Bigdecimal,我需要从BigDecimal以及RoundingMode.HALF\u 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 zer

我需要从
BigDecimal
以及
RoundingMode.HALF\u 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.
在本例中,它返回
6E+2
。我需要在JSF中的自定义转换器中使用它,因为最终用户可能会觉得它很难看。那么,正确的方法是什么呢?

使用

我还不喜欢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>

您也可以通过以下方式完成此任务:

final BigDecimal b = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP);
String f = String.format("%.0f", b);
System.out.println(f); //600
注意,这也不是很好

关于这一点:

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

输出(Java 8):


Java 7中的
0.0000
问题在Java 8中通过以下方式得到解决。

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

    BigDecimal toPay = new BigDecimal(1453.00005);
    toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)
它对我有用。

你可以用。 例如:

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对象上执行此操作,而不是使用格式化程序将其转换为字符串,您可以在Java 8上执行此操作,只需两个步骤:

  • stripTrailingZeros()
  • 如果刻度<0,如果不喜欢ESPONENAL/科学记数法,则将刻度设置为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
    
    BigDecimal-BigDecimal=BigDecimal.valueOf(Double.parseDouble(“50”);
    bigDecimal=bigDecimal.setScale(2);
    bigDecimal=bigDecimal.stripTrailingZeros();
    
    if(bigDecimal.scale()类似于
    999.99
    的数字返回
    1000
    ,但它返回与
    相同的
    999.99
    它应该这样做。因此,它似乎不是像
    BigDecimal
    那样的精确表示法。我是否遗漏了什么?这对我来说很有用。0.0000的数量仍然很奇怪,但它清除了其他可能的值,当请求的精度低于可用值时,~dp值为0的值跟在后面。这不是我发现的。。。您关于从“0.0000”中剥离零的第一个示例在“toString()”和“toPlainString()”中都会产生“0”。我们是否在做不同的事情?Java 8修复了一个错误,因此第一个示例是“0”(Java 7行为是“0.0000”)。这对我来说很好。BigDecimal在使用科学记数法时将刻度设置为负值。
    0: plain=0
    4E+1: plain=40
    40.5: plain=40.5
    
        BigDecimal toPay = new BigDecimal(1453.00005);
        toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)
    
    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 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