代码之家  ›  专栏  ›  技术社区  ›  John McBrown

大小数精度问题?

  •  0
  • John McBrown  · 技术社区  · 13 年前

    我正在写一个程序,在这个程序中我必须反复乘以2 BigDecimal .

    在第27次迭代之后,我得到:

    0.905225895893387921845435055445776361046057346344145563957027726

    使用此数字进行的任何进一步计算 (BigDecimal * 0.182365681285) 导致尾随零。因此,下一次迭代返回: 0.905225895893387921845435055445776361046057346344145563957027726000000000000

    之后的迭代返回: 0.905225895893387921845435055445776361046057346344145563957027726000000000000000000000000


    所以我想知道这是否是由于 大小数 .

    任何帮助都将不胜感激

    编辑:我被要求发布我的代码。我可以复制粘贴我所拥有的几页,但这是我迄今为止所拥有的非常准确的表示:

    BigDecimal range = new BigDecimal(0.0012440624293146346);
    for(int i = 0; i < 50 ; i++){
        low = low.multiply(range);
    }
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   JB Nizet    13 年前

    乘法方法创建一个BigDecimal,其小数位数等于第一个操作数的小数位数+第二个操作数小数位数,即使这会导致后面的零。要去掉后面的零,请使用。。。 stripTrailingZeros() .

        2
  •  0
  •   Peter Lawrey    13 年前

    我在模拟尾随零时发现了一种情况。

    BigDecimal bd = BigDecimal.valueOf(0.5);
    BigDecimal a = BigDecimal.valueOf(1 << 20).divide(BigDecimal.valueOf(1000000));
    for (int i = 0; i < 20; i++) {
        System.out.println(a);
        a = a.multiply(bd);
    }
    

    注意:BigDecimal不认为默认情况下要去掉尾部的零

    1.048576
    0.5242880
    0.26214400
    0.131072000
    0.0655360000
    0.03276800000
    0.016384000000
    0.0081920000000
    0.00409600000000
    0.002048000000000
    0.0010240000000000
    0.00051200000000000
    0.000256000000000000
    0.0001280000000000000
    0.00006400000000000000
    0.000032000000000000000
    0.0000160000000000000000
    0.00000800000000000000000
    0.000004000000000000000000
    0.0000020000000000000000000
    

    你没有理由得到零,除非你每次都乘以转换为BigDecimal的双值,否则不应该有零。

    推荐文章