黑马程序员技术交流社区

标题: 麻烦大神指点哈,为啥不能得到期望结果?<关于double运算> [打印本页]

作者: 茂子    时间: 2014-6-18 09:16
标题: 麻烦大神指点哈,为啥不能得到期望结果?<关于double运算>
  1. //输入一个小数要求保留该小数的后两位

  2. class  MathDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 printNum(7.56);
  7.         }

  8.         public static void printNum(double num)
  9.         {
  10.                 double x=Math.floor(num);//返回小于num的最大整数
  11.                 sop("该小数的后两位是:"+(num-x));
  12.         }

  13.         public static void sop(Object obj)
  14.         {
  15.                 System.out.println(obj);
  16.         }
  17. }
复制代码

作者: 马宁    时间: 2014-6-18 13:10
浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对符点数的运算时结果具有不可预知性
float和double只能用来作科学计算或者是工程计算,但在商业计算中要用java.math.BigDecimal

这也是在网上找的资料,参照你的写的。具体的也不是很清楚 !

  1. import java.math.*;
  2. class MathDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 printNum(3.34);
  7.         }
  8.         public static void printNum(double num)
  9.         {
  10.                 double  x = Math.floor(num);
  11.                 System.out.println(x);
  12.                 System.out.println(MathTest.sub(num,x));
  13.         }
  14. }
  15. class MathTest
  16. {
  17.         public static double sub(double d1,double d2)
  18.         {
  19.         //将d1转换为字符串类型,再转换为BigDecimal类型。
  20.         BigDecimal b1=new BigDecimal(Double.toString(d1));     
  21.         BigDecimal b2=new BigDecimal(Double.toString(d2));

  22.          //b1.subtract(b2) 返回一个 BigDecimal,其值为(b1-b2)
  23.         //doubleValue()  将BigDecimal类型转换为double类型;
  24.         return (b1.subtract(b2)).doubleValue();     
  25.         }
  26. }
复制代码




作者: 唐坚    时间: 2014-6-18 13:35
           学习了
作者: wangmin    时间: 2014-6-18 15:13
学习了  
作者: gyw520gyw    时间: 2014-6-18 21:33
我以另一种方法做的,结果出来了,不知道是不是你想要的,

  1. public static void main(String[] args)
  2.      {
  3.                  
  4.                  printNum(7.56);
  5.      }

  6.      public static void printNum(double num)
  7.      {
  8.             String num1 = Double.toString(num);
  9.             //sop("x=" + num1); //测试打印num1的值
  10.             String[] num2 = num1.split("\\.");//以小数点切割
  11.             //sop(num2.length);//测试打印长度
  12.             String str = null;
  13.             for(int i = 0; i < num2.length; i++){
  14.                     str = num2[1];//一个小数以小数点切割,装入数组,角标为1的值既小数点后的值
  15.             }
  16.             sop("该小数的后两位是:   " + str);//

  17.      }

  18.      public static void sop(Object obj)
  19.      {
  20.              System.out.println(obj);       
  21.      }
复制代码

作者: 我叫MT    时间: 2014-6-18 21:50
  1. //带四舍五入的
  2. public class Demo {
  3.         public static void main(String[] args) {
  4.                 double d = 23.4565;
  5.                 d = demo(d);
  6.                 System.out.println(d);
  7.         }
  8.         public static double demo(double d){
  9.                 int x = (int)((d+0.005)*100);
  10.                 d = x;
  11.                 return d/100;
  12.         }
  13. }

  14. //不带四舍五入的
  15. public class Demo2 {
  16.         public static void main(String[] args) {
  17.                 double d = 23.4565;
  18.                 d = demo(d);
  19.                 System.out.println(d);
  20.         }
  21.         public static double demo(double d){
  22.                 int x = (int)(d*100);
  23.                 d = x;
  24.                 return d/100;
  25.         }
  26. }
复制代码

作者: yogaa    时间: 2014-6-18 23:08
    在你原码上改的,已测试,可以运行~
    public static void main(String[] args) {

                printNum(7.85);
        }

        public static void printNum(double num) {
                double x = Math.floor(num);
                Double b = num - x;
                char[] c = b.toString().toCharArray();
                String s = b.toString();
                System.out.print(num+"小数点后两位是:");
                for (int i = 0; i < c.length; i++) {
                        if (i < 3) {
                                sop(c[i]);
                        } else if (i == 3 && c[i + 1] >= 53) {                //整形数字5转换成char型值为53
                                c[i] += 1;
                                sop(c[i]);
                                break;
                        } else if (i == 3) {
                                sop(c[i]);
                                break;
                        }
                }
                System.out.println("(四舍五入)");
        }

        public static void sop(Object obj) {
                System.out.print(obj);
        }
}


作者: Fisherman    时间: 2014-6-19 15:30
学习啦,学习啦,谢谢喽




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