黑马程序员技术交流社区

标题: 一道编程题,求思路 [打印本页]

作者: 王健    时间: 2012-8-10 01:22
标题: 一道编程题,求思路
给定一个double类型的小数,要求进行四舍五入,然后保留三位,如果为负数,则返回其绝对值。
不懂,求思路。
PS:上个网不容易,网速很卡,可能问题解决后不会很及时更改为已解决,求斑竹们谅解,火帮忙修改。


作者: 徐小骥    时间: 2012-8-10 01:30
本帖最后由 徐小骥 于 2012-8-10 19:51 编辑

采用BigDecimal
        import java.math.BigDecimal;      
        double dout=12.3456;
        BigDecimal bd=new BigDecimal(dout);
        bd=bd.setScale(3, BigDecimal.ROUND_HALF_UP); //3就是保留三位数
        if(bd.doubleValue() <0){
        bd=Math.abs(bd.doubleValue());
        }
        System.out.println(bd.doubleValue());
作者: 牛杨    时间: 2012-8-10 01:41
本帖最后由 牛杨 于 2012-8-10 02:03 编辑

楼主问的是整个double数据保留三位,还是 这个double数据保留小数点后三位呢?
不明白,那我就死马当活马医吧。{:soso_e113:} ,保留小数点后三位了,感觉这种可能性大点。
主要思路:
1、先把double型的 d 扩大1000倍;
2、就是利用Math类中的long round(double d)方法,这个方法能返回d四舍五入后的long型值 l。
3、再把 l 缩小 1000.0(必须写出这种形式)后返回;
public static void main(String[] args)
{
          double d=13.76434;
          sop("d原值:"+d);
          sop("保留三位小数的d:"+saveThree(d));
}
public static double saveThree(double d)
{
       if(d<0)
           return Math.abs(d);   
        d=d*1000;
        long l =Math.round(d);//因为这个函数返回的是四舍五入后的long型值,所以在调用这个函数的前后,要对得到的数据进行*1000 , /1000.0的操作。
        return  l/1000.0; //必须写出1000.0的形式因为要把 long型的l 转换成double型的数据返回的。
}
public static void sop(Object obj)
{
          System.out.println(obj);
}

自己构造四舍五入的算法
如果楼主不想用java.lang包中的Math类那么可以这样写:
//四舍五入的原理
  double d1 = d*1000;

  d1 = d1+0.5; //这一步最关键了。 如果你d1小数点后第四位是 0到4之间的数,那么加上0.5后不会向小数点后第三位进1 。如果d1小数点后第四位是 5到9之间的数,那么
加上0.5后就会向小数点后第三位进1了。这也就完成了四舍五入保留小数的主要转换了。
double d2 = (int)d1;//这一步最关键了。舍去小数点后三位意外的数据。

  double d3 = d2/1000.0;
  sop("d3="+d3);//打印输出四舍五入后的结果。
作者: 李知伦    时间: 2012-8-10 19:00
徐小骥 发表于 2012-8-10 01:30
采用BigDecimal
        import java.math.BigDecimal;      
        double dout=12.3456;

我觉得你的代码没问题,但是为什么带入12.3455的时候,不能输出12.346呢
ROUND_HALF_UP字段是说>=0.5就入的啊


作者: 徐小骥    时间: 2012-8-10 19:52
李知伦 发表于 2012-8-10 19:00
我觉得你的代码没问题,但是为什么带入12.3455的时候,不能输出12.346呢
ROUND_HALF_UP字段是说>=0.5就入的 ...

还真是,这是查了下jdk,并没有用代码验证,刚刚用尾数为5的测试,发现果然有问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2