神奇的鸭蛋
2010-10-13 14:59
浏览 267
已采纳

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

想要一个跟我们传统学的四舍五入的方法,网上多说下面的方法可以用,我测了下,发现有很多问题啊。当所要求的小数位小于等于1位时没错误,但当小数位2位以上就有问题了,下面是测试用例,及结果。测试发现当所要小数位为2位时,遇到偶数进1,奇数不进。十位数不位空时也是如此。 8) 谁说下这个啥回事?顺便求其他传统格式化方法。DecimalFormat这个类也不行,奇数进1偶数不进的
[code="java"]
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());

}
}
[/code]

输出结果: 想要的结果
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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

  • CaiHuajiang 2010-10-13 15:24
    最佳回答

    你定义的方式有问题。
    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)

    评论
    解决 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题