神奇的鸭蛋 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 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败