今天做做练习题时发现了一个问题:
这道题是将一个数据以三种格式输出,可是最后一个方法,即以科学计数法输出时却出现问题,代码如下:
public class DoubleOut{    public static void write(double amount){        if(amount>0){            System.out.print('$');
            writePositive(amount);        }else{            double positiveAmount=-amount;
            System.out.print('s');
            System.out.print('-');
            writePositive(positiveAmount);        }    }//end write()    private static void writePositive(double amount){        int allCents=(int)(Math.round(amount*100));
        int dollars=allCents/100;
        int cents=allCents%100;
        System.out.print(dollars);
        System.out.print('.');
        if(cents<10){            System.out.print('0');
            System.out.print(cents);        }else{            System.out.print(cents);        }    }//end writePositive    public static void writeln(double amount){        write(amount);
        System.out.println();    }//end writeln    public static void write(double number,int digit){     if(number>=0){     writePositive(number,digit); }else{     double positiveNumber=-number; System.out.print("-"); writePositive(positiveNumber,digit); }//end if-else }//end write() private static void writePositive(double number,int digit){     double digitCopy=digit; int finalNumber=(int)Math.round(number*Math.pow(10.0,digitCopy)); int integerPart=finalNumber/(int)Math.pow(10.0,digitCopy); int decimalPart=finalNumber%(int)Math.pow(10.0,digitCopy); System.out.print(integerPart); System.out.print("."); int count=0; int decimalPartCopy=decimalPart;     while(decimalPartCopy<(int)Math.pow(10.0,digitCopy)){     if(decimalPartCopy==0){     decimalPartCopy=(decimalPartCopy+1)*10; }else{     decimalPartCopy=decimalPartCopy*10; }//end if-else count++; }//end while for(int i=1;i<count;i++){     System.out.print("0"); }//end for System.out.print(decimalPart); }//end writePositive() public static void writeln(double number,int digit){     write(number,digit); System.out.println(""); }//end writeln()    public static void scienceWrite(double number){
    
        if(number>=0){
        
            scienceWritePositive(number);
        
        }else{
        
            double positiveNumber=-number;
            
            System.out.print("-");
            
            scienceWritePositive(positiveNumber);
        
        }
    
    }//end scienceWrite()    private static void scienceWritePositive(double number){        String numberCopy=Double.toString(number);        int theIndexOfThePoint=numberCopy.indexOf(".");        int length=numberCopy.length();        int theIndexOfTheFirst=0;        char theFirst=numberCopy.charAt(theIndexOfTheFirst);        while((theFirst=='0')||(theFirst=='.')){
        
            theIndexOfTheFirst++;
            
            theFirst=numberCopy.charAt(theIndexOfTheFirst);
        
        }        int theNumberAfterE=theIndexOfTheFirst-theIndexOfThePoint;        double theFormatedNumber=number/Math.pow(10.0, theNumberAfterE);        System.out.print(theFormatedNumber);        System.out.print("e");        System.out.print(-theNumberAfterE);
        
    }//end scienceWritePositive()
    
    public static void scienceWriteln(double number){        scienceWritePositive(number);        System.out.println("");    }//end scienceWriteln()    public static void main(String[] args){        DoubleOut.writeln(0.052165);        DoubleOut.writeln(0.052165,3);        DoubleOut.scienceWriteln(0.052165);    }//end main()
}第一个输出$0.05,没问题;
第二个输出0.052,没问题;
但第三个却输出5.2165E-4e-2(我想得到的结果是输出5.2165e-2)那么请问高手中间的E-4是怎么回事,怎么会输出这个东西来?

解决方案 »

  1.   

            System.out.print(theFormatedNumber);    输出5.2165E-4        System.out.print("e");                  输出 e        System.out.print(-theNumberAfterE);     输出-2
    5.2165E-4 就是 5.2165/10000
    E-4就是10的-4次幂
      

  2.   

    其实楼主的scienceWritePositive对数据的处理方法是不对的,因为一个double值,在用Double的toString方法转化成字符串时,有可能会被转化成科学计数法的形式,既为x.xxE-x的形式,这种情况下,根据小数点的位置来判断该数据是不对的。另外,double theFormatedNumber=number/Math.pow(10.0, theNumberAfterE);也是不正确的,按照楼主代码的意思,该处应该是乘,而不是除。最后,print输出时,如果数值太小,同样也可能会直接输出为科学表示法的形式,所以楼主要想实现scienceWritePositive,就不应该用print直接输出一个小的double值。给楼主提供一个简单的方法:
    输入:一个比较小的double值 d(只考虑整数的情况,负数类似)。
    处理:判断该double值 d,如果d小于1,则用一个循环每次将d乘以10(大于1的话就每次都除以10),直到d的值位于1和10之间,期间记录乘以10的次数,这样就可以得到一个介于1和10之间的小树和原始double值d的次数,此时再用楼主的方法先print d的值,再写e,然后写-和次数就应该没问题了。代码:
    String scienceWritePositive(double d)
    {
       /* 只处理整数且d小于1的情况 */
       if (d < 0)
          return "";
       
       if (d > 1)
          return String.valueOf(d);   int times = 0;
       while (d < 1.0)
       {
           d *= 10.0;
           times++;
       }
       
       System.printf("%fE-%d", d, times);
    }
    希望该回答对楼主有用