0 0

传统的四舍五入BigDecimal类,BUG?20

想要一个跟我们传统学的四舍五入的方法,网上多说下面的方法可以用,我测了下,发现有很多问题啊。当所要求的小数位小于等于1位时没错误,但当小数位2位以上就有问题了,下面是测试用例,及结果。测试发现当所要小数位为2位时,遇到偶数进1,奇数不进。十位数不位空时也是如此。 谁说下这个啥回事?顺便求其他传统格式化方法。DecimalFormat这个类也不行,奇数进1偶数不进的
public class test {
 public static void main(String[] args) {
  double a = 1.5;
  double b = 2.5;
  double c = 1.35;
  double d = 2.35;
  double e = 2.355;
  double f = 2.345;
  double g= 12.35;
  BigDecimal bigA =new BigDecimal(a).setScale(0, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigB =new BigDecimal(b).setScale(0, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigC =new BigDecimal(c).setScale(1, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigD =new BigDecimal(d).setScale(1, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigE=new BigDecimal(e).setScale(2, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigF=new BigDecimal(f).setScale(2, BigDecimal.ROUND_HALF_UP);
  BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP);
  System.out.println("test A:"+bigA.doubleValue());
  System.out.println("test B:"+bigB.doubleValue());
  System.out.println("test C:"+bigC.doubleValue());
  System.out.println("test D:"+bigD.doubleValue());
  System.out.println("test E:"+bigE.doubleValue());
  System.out.println("test F:"+bigF.doubleValue());
  System.out.println("test G:"+bigG.doubleValue());

 }
} 


输出结果:         想要的结果
test A:2.0         2.0
test B:3.0         3.0
test C:1.4         1.4
test D:2.4         2.4
test E:2.35   X    2.36
test F:2.35        2.35
test G:12.3   X    12.4
2010年10月13日 14:59

3个答案 按时间排序 按投票排序

0 0

采纳的答案

你定义的方式有问题。
double g= 12.35;  定义了一个g=12.34444444444444449,假如是这个数
new BigDecimal(g)   g还是12.34444444444444449
new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP);   12.34


正确的定义方式是使用字符串构造函数
new BigDecimal("12.35").setScale(1, BigDecimal.ROUND_HALF_UP)

2010年10月13日 15:24
0 0

可以看下这个博客。

http://guoliangqi.iteye.com/admin/blogs/670908

2010年10月13日 23:55
0 0

public static double round(double value,int scale){  
 
if(scale<0){  
 
throw new IllegalArgumentException(  

The scale must be a positive integer or zero");  
 
}

BigDecimal b = new BigDecimal(Double.toString(value));  

BigDecimal one = new BigDecimal("1");  

return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
}

试试上面的方法吧!!!

2010年10月13日 16:34

相关推荐

Global site tag (gtag.js) - Google Analytics