谁让你在高精度要求的时候用double的?两个方案:
1.全部用BigDecimal
2.用long, 自己负责跟踪小数点高精度要求的地方只能用int,long, BigDecimal

解决方案 »

  1.   

    to : jigsaw(jigsaw) 
    我上面也没有用其他的呀 全部是用的BigDecimal呀
      

  2.   

    to : jigsaw(jigsaw)
    在BigDecima中的计算都是转换为long来计算的
    我觉得应该是正确 不知计算完后还是这样的结果 (与System.out.println(23.0d*0.6d)一样的)
      

  3.   

    这没有什么好奇怪的,jigsaw(jigsaw) 的解释很清楚了.
    你用了双精度浮点来表示这个结果.
    如果要得到精确的值,就不要使用双精度浮点或者浮点
    或者你对BigDecimal w setScale(1,BigDecimal.ROUND_UP_HALF)得到期望精度的数也就是13.8
    关于double表示精确数值存在的问题可以看看下面的一个例子:
    假设有1元买商品,商品价格分别是0.1元/0.2元/0.3元/0.4元递增,那么一元能买几个?应该是4个.看看用double作的例子:
    public class Test {
        public static void main(String[] args) {
            double total = 1.0;
            int count = 0;
            for ( double price=.1; total>=price; price+=0.1 ) {
                    total -= price;
                    count ++;
            }
            System.out.println("Remain:"+total);
            System.out.println("Count:"+count);
        }
    }
    运行结果是:
    Remain:0.3999999999999999
    Count:3
    本来期望能买完4件商品,一分不剩,但是还剩0.39999....元,只买了3件.
      

  4.   

    multiply(BigDecimal val) 
              Returns a BigDecimal whose value is (this * val), and whose scale is (this.scale() + val.scale()).
    注意这句:whose scale is (this.scale() + val.scale())
      

  5.   

    是呀 这有什么呀?
    this.scale() 这个数是按照IEEE745表示时的幂 在作乘法时当然要加上了
    你用数学算的话 它也为13.8呀