看了下API 
也翻了下前面的帖子,还是不明白啊 
看过一个精确的4舍5入的方法:    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,10).doubleValue();
    }
这里面可以把scale 当参数传进去!!而当我对一个BigDecimal对象使用setScale(int)时候出异常呢??我们到底该什么时候用Scale??
难道只能在divide的时候用???求解啊

解决方案 »

  1.   

    这个问题是有点棘手,不过也不是非常难理解:
    Scale指的是小数点后面的位数。
    BigDecimal可以通过setScale来提高精度,只要新设的值比原来的大!
    BigDecimal也可以通过setScale来降低精度。因为新设的值比原来的小,所以必须保证原来数值的该位小数点后面都是0,只有这样才可以设比原来小的精度。
      

  2.   

    给你举例说吧:
    如果原来的值是:4.1235648,你想把scale设为小于7为都会出错的,如果原来的值是:4.1235000,你把scale设为小于4位会出错,而设为4、5、6、7都没有问题,当然设得更大,肯定不会出错
      

  3.   

    楼上的 还是有问题 
    public static void main(String[] args){
           BigDecimal bd = new BigDecimal("4.1235000");
           
           bd.setScale(6);
           
           System.out.println(bd.doubleValue());
    }
    如果BigDecimal构照函数是字符串的话 你在bd.setScale(6);//设4 5 6 7 都是显示4.1235 , 小于4的话异常如果是:
    public static void main(String[] args){
           BigDecimal bd = new BigDecimal(4.1235000);
           
           bd.setScale(6);
           
           System.out.println(bd.doubleValue());
    }
    BigDecimal构照函数是字符串的话 你在bd.setScale(6);//这里不管设成几都有异常, 这是怎么会事?
      

  4.   

    那是因为构造函数用字符串的话,BigDecimal的精度(scale)就是字符串的小数点后面的位数。
    而当构造函数用double型做参数的话,由于计算机使用2进制表示,那么4.1235在计算机中的表示并不是4.1235,而是4.12349999999999994315658113919198513031005859375 ,那它的精度(scale)的精度就是47位,所以你把它设为6肯定会出错
      

  5.   

    哦,这个问题明白了!!public static void main(String[] args){
           BigDecimal bd = new BigDecimal("4.1235000");
           
           bd.setScale(6); 
           
           System.out.println(bd.doubleValue());
    }
    那为什么 在bd.setScale(6);//这里设4 5 6 7的话为什么都是显示4.1235 ,而不是我要的精度4.12350 4.123500 4.1235000 呢??
    是不是因为上面那 4.12350 4.123500 4.1235000 都是大小一样,所以在doubleValue()都只显示4.1235啊?
      

  6.   

    哎呀,你这个4.1235是因为double类型的缘故,是double把后面的000去掉了!
    你打印System.out.println(bd);或者System.out.println(bd.toString());就可以看到,BigDecimal的精度是准确的!