为什么新的BigDecimal("0.0").stripTrailingZeros()的比例为1?

fge*_*fge 17 java bigdecimal

运行这个简单的程序:

public static void main(final String... args)
{
    System.out.println(BigDecimal.ZERO.scale());
    System.out.println(new BigDecimal("0").scale());
    System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale());
    System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale());
}
Run Code Online (Sandbox Code Playgroud)

输出:

0
0
1
0
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:为什么不是第三个println输出0?那似乎合乎逻辑......

编辑:好的,所以,这是一个非常古老的错误:

错误链接

事实上,它"适用于"任意数量的零:new BigDecimal("0.0000").stripTrailingZeroes().scale()是4!

Joo*_*gen 8

实际上"0.0"是例外,因为它没有stripTrailingZeroes. 一个错误!

public static void main(final String... args) {
    p("0");
    p("0.0");
    p("1.0");
    p("1.00");
    p("1");
    p("11.0");
}

private static void p(String s) {
    BigDecimal stripped = new BigDecimal(s).stripTrailingZeros();
    System.out.println(s + " - scale: " + new BigDecimal(s).scale()
        + "; stripped: " + stripped.toPlainString() + " " + stripped.scale());
}

0 - scale: 0; stripped: 0 0
0.0 - scale: 1; stripped: 0.0 1
1.0 - scale: 1; stripped: 1 0
1.00 - scale: 2; stripped: 1 0
1 - scale: 0; stripped: 1 0
11.0 - scale: 1; stripped: 11 0
Run Code Online (Sandbox Code Playgroud)

在Java 8中修复!请参阅@ vadim_shb的评论.

  • 这是一个已知的错误:http://bugs.sun.com/bugdatabase/view_bug.do?video_id = 6480539 (4认同)
  • @Andremoniy:不要指望它;-) (3认同)
  • 它已在JDK 8中修复.http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/2ee772cda1d6 (2认同)