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

5

我做以下操作

    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个回答

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

使用Java 7打印0.0000,但使用Java 8打印0。这显然是一个错误,已在Java 8中修复


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的重载)你需要想办法解决这个问题。


不,它不会返回任何值。它会两次返回0.0000。 - Reinstate Monica
BigDecimal d = new BigDecimal("0.0000"); System.out.println(d.stripTrailingZeros()); 会打印出 0。 - assylias
2
它真的真的不行。至少对我来说是这样。更重要的是,对于OP也是如此。;) - Reinstate Monica
确实很有趣。 :) 我想知道会有多少应用程序会默默崩溃。 - Reinstate Monica
1
这个问题已经在这里得到修复:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6480539 - Julian Descottes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接