为什么不BigDecimal.stripTrailingZeros()总是删除所有尾随零?

时间:2014-01-27 15:30:04

标签: java rounding bigdecimal

我做以下

    MathContext context = new MathContext(7, RoundingMode.HALF_UP);
    BigDecimal roundedValue = new BigDecimal(value, context);

    // Limit decimal places
    try {
        roundedValue = roundedValue.setScale(decimalPlaces, RoundingMode.HALF_UP);
    } catch (NegativeArraySizeException e) {
        throw new IllegalArgumentException("Invalid count of decimal places.");
    }
    roundedValue = roundedValue.stripTrailingZeros();

    String returnValue = roundedValue.toPlainString();

如果输入现在为“-0.000987654321”(=值),我会返回“-0.001”(=返回值),这是正常的。

如果输入现在为“-0.0000987654321”,我会回到“-0.0001”,这也没关系。

但是当输入现在是“-0.00000987654321”时,我得到“0.0000”而不是“0”,这是不行的。这有什么不对?为什么在这种情况下不删除尾随零?

2 个答案:

答案 0 :(得分:8)

BigDecimal d = new BigDecimal("0.0000");
System.out.println(d.stripTrailingZeros());

使用Java 7打印0.0000但使用Java 8打印0。这显然是Java {8}中bugfixed

答案 1 :(得分:1)

从BigDecimal的stripTrailingZeros:

的描述中

“返回一个BigDecimal,它在数值上等于此值,但从表示中删除了任何尾随零。例如,从BigDecimal值600.0中剥离尾随零,其中[BigInteger,scale]组件等于[6000, 1],产生6E2,[BigInteger,scale]分量等于[6,-2]“

换句话说,它不会做你想做的事。而是使用setScale(0)方法。我写的以下测试代码给出了以下输出:

    BigDecimal d = new BigDecimal("0.0000");
    System.out.println(d.toString());
    d = d.setScale(0);
    System.out.println(d.toString());

0.0000
0

编辑:当为0.0001执行此操作时,您会收到错误消息。您还需要设置舍入模式。 (setScale的重载)你必须弄清楚要解决的问题。