神奇的鸭蛋 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条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型