编写一个四舍五入的函数,要求可以保留到小数后面的任意一位(如3.1415997保留到小数点后第5位后得到3.14160)double number(double d, int n)
{for(int i=0; i<n;i++)
   d*=10;
d = Math.round(d);
for(int i=0;i<n;i++)
   d/=10;
return d;
}这个算法会出现问题,应该是精度的问题吧。
哪位高手能给出个不用java.text.NumberFormat类和DecimalFormat类的算法,就只用简单的算法,最好只用lang包中的类,,可以么??????分不够再加!!!

解决方案 »

  1.   

      static double number(double d, int n)
      {
      double s1 = Math.pow(10, n);
      
      d = Math.round(d*s1)/s1;
      
      return d;
      }
      

  2.   

    NumberFormat nf = NumberFormat.getNumberInstance();
    nf.setMinimumFractionDigits(5);  // 设置精确到小数点后5位
    System.out.println(nf.format(3.1415997));需import java.text.NumberFormat
      

  3.   

    晕,看错楼主要求了,我以为楼主要的是用NumberFormat。
      

  4.   

    但是如果非要末尾那个0的话,不知道怎么弄了。
    -----------------------------------------
      static double number(double d, int n)
      {
      double s1 = Math.pow(10, n);
      double s2 = Math.pow(0.1, n);
      
      d = Math.round(d*s1)*s2;
      
      return d;
      }
    这样的话,又会长出好多来,晕了。
      

  5.   

    个人感觉, 只是对10做整数次乘方,用Math.pow()太浪费了,而且精度不高。下面的方法应该可行:static double format(double num, int frac) {
    double bits = 1;
    for (int i = 0; i < frac; i++)
    bits *= 10;
    return Math.round(num * bits) / bits;
    }
      

  6.   

    楼主要搞清楚,做为double来说,3.14160和3.1416在内存中存储的形式是完全一样的,都是存储为3.1416。而只有作为字符串,"3.14160"才区别于"3.1416"。
      

  7.   

    考虑到最后可能输出"0",这样的方法只能输出为 String,而非 double 类型。