BigDecimal的 Scale 到底是什么`````````

zhouysh 2005-06-13 07:34:27
看了下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的时候用???

求解啊
...全文
1866 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chylwk 2005-06-17
  • 打赏
  • 举报
回复
哎呀,你这个4.1235是因为double类型的缘故,是double把后面的000去掉了!
你打印System.out.println(bd);或者System.out.println(bd.toString());就可以看到,BigDecimal的精度是准确的!

zhouysh 2005-06-17
  • 打赏
  • 举报
回复
哦,这个问题明白了!!

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啊?


chylwk 2005-06-16
  • 打赏
  • 举报
回复
那是因为构造函数用字符串的话,BigDecimal的精度(scale)就是字符串的小数点后面的位数。
而当构造函数用double型做参数的话,由于计算机使用2进制表示,那么4.1235在计算机中的表示并不是4.1235,而是4.12349999999999994315658113919198513031005859375 ,那它的精度(scale)的精度就是47位,所以你把它设为6肯定会出错
zhouysh 2005-06-16
  • 打赏
  • 举报
回复
为什么某有人啊
zhouysh 2005-06-15
  • 打赏
  • 举报
回复
楼上的 还是有问题
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);//这里不管设成几都有异常, 这是怎么会事?

zhouysh 2005-06-15
  • 打赏
  • 举报
回复
哇 楼上的
谢谢你啊!
chylwk 2005-06-14
  • 打赏
  • 举报
回复
给你举例说吧:
如果原来的值是:4.1235648,你想把scale设为小于7为都会出错的,如果原来的值是:4.1235000,你把scale设为小于4位会出错,而设为4、5、6、7都没有问题,当然设得更大,肯定不会出错
chylwk 2005-06-14
  • 打赏
  • 举报
回复
这个问题是有点棘手,不过也不是非常难理解:
Scale指的是小数点后面的位数。
BigDecimal可以通过setScale来提高精度,只要新设的值比原来的大!
BigDecimal也可以通过setScale来降低精度。因为新设的值比原来的小,所以必须保证原来数值的该位小数点后面都是0,只有这样才可以设比原来小的精度。
zhouysh 2005-06-14
  • 打赏
  • 举报
回复
为什么没人啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧