有谁知道,如果这是一个Java库的错误?(Does anyone know if this is a

2019-10-22 04:32发布

**这是修正后**

我正在使用的BigDecimal一些非常复杂的数学计算和几千测试ONE遇到了一个错误。 有谁知道我做错了什么傻事? 我不认为如此。

以下的输出(从原始交校正)是从计算几个轨迹中的一个。 看来,如果单纯的Java只打印非BigInteger的变量不正确,因为函数工作-用X,九,y和IY。 现在的问题是:为什么X的变化从一个打印到下一个价值? - 它似乎并不喜欢的事,我应该能够做到。

在发生错误时,我不小心做内部常量PI和电子精确到1500位小数。 在1000米的地方,一切正常,没有错误。

转储中的值x是巧合=是2 * PI是约6.283185307179586476925286766559下面是该代码段。

public  static  int     cmp(BigDecimal x, BigDecimal y, int places)
{
    BigInteger ix = x.movePointRight(places).toBigInteger();

    String sInt = ix.toString();
    BigDecimal shiftX = x.movePointRight(places);
    String sx = x.movePointRight(places).toString();
    int dot = sx.indexOf('.');          // making the shifted x
    if (dot > 0)                        //  string into an integer string
        sx = sx.substring(0,dot);       //   just for comparison
    if ( !sx.equals(sInt) )
    {
        System.out.println("******  cmp(): Mismatch between X values.    dec places = " + places);
        System.out.println("x                   = " + x);
        System.out.println("x.toString()        = " + x.toString());
        System.out.println("x.toPlain()         = " + x.toPlainString());

        System.out.println("x.right() #1        = " + x.movePointRight(places));
        System.out.println("x.right() #2        = " + shiftX);
        System.out.println("x.right() #3        = " + sx);

        String shiftXStr = x.movePointRight(places).toString();
        System.out.println("x.right().str() #1  = " + x.movePointRight(places).toString());
        System.out.println("x.right().str() #2  = " + shiftXStr);

        String shiftXPlain = x.movePointRight(places).toPlainString();
        System.out.println("x.right().plain() 1 = " + x.movePointRight(places).toPlainString());
        System.out.println("x.right().plain() 2 = " + shiftXPlain);

        System.out.println("x.toBigInt()        = " + x.toBigInteger());

        System.out.println("BigInt(x) #1        = " + x.movePointRight(places).toBigInteger());
        System.out.println("BigInt(x) #2        = " + ix);

        System.out.println("BigInt(x).str() 1   = " + x.movePointRight(places).toBigInteger().toString());
        System.out.println("BigInt(x).str() 2   = " + sInt);
    }

输出是:(仅最后一行和2从它所是正确的注意,错误的值总是2 ^ n中的正确值的倍数,其中包括未图示为了简洁测试 - 我在正确的切断了。可读性)

******  cmp(): Mismatch between X values.    dec places = 595
x                   = 205887.41614566068967588779676660550101874569
x.toString()        = 205887.41614566068967588779676660550101874569
x.toPlain()         = 205887.41614566068967588779676660550101874569
x.right() #1        = 205887416145660689675887796766605501018745693
x.right() #2        = 205887416145660689675887796766605501018745693
x.right() #3        = 205887416145660689675887796766605501018745693
x.right().str() #1  = 205887416145660689675887796766605501018745693
x.right().str() #2  = 205887416145660689675887796766605501018745693
x.right().plain() 1 = 205887416145660689675887796766605501018745693
x.right().plain() 2 = 205887416145660689675887796766605501018745693
x.toBigInt()        = 205887
BigInt(x) #1        = 205887416145660689675887796766605501018745693
BigInt(x) #2        = 628318530717958647692528676655900576839433879
BigInt(x).str() 1   = 205887416145660689675887796766605501018745693
BigInt(x).str() 2   = 628318530717958647692528676655900576839433879

**我相信这是只是错在原始数据的标签。

Answer 1:

这大概属于这里。

我必须说,感谢大家谁看了一下这个问题。

也许是我无意中发现了答案,这是我的问题,兴高采烈。 我发现在我的测试程序中的错误并修复它清除了上面的问题。 这个问题我真的也后就走了,但由于某些原因,诊断痕迹仍然打印值不一致类似上述的那些,这仍然是一个谜。

整个问题似乎有些事情要与继承类的静态初始化中我想的顺序没有发生 - 在一种情况下。



Answer 2:

跟进。 我是不正确的。 上面的“答案”的测试程序只是部分解决了这个问题。 它并没有真正的程序工作。

我意识到这是相当复杂的,但我没有发现,纠正了神秘的不一致输出修复,这应该证明有说服力:

添加以下行使用toBigDecimal()[该错误的数据]之前:
X =新的BigDecimal(x.toString());

我会怀疑BigDecimal的一些属性已经得到破坏。 这不是规模。



文章来源: Does anyone know if this is a Java library bug?