今天做做练习题时发现了一个问题:
这道题是将一个数据以三种格式输出,可是最后一个方法,即以科学计数法输出时却出现问题,代码如下:
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是怎么回事,怎么会输出这个东西来?
这道题是将一个数据以三种格式输出,可是最后一个方法,即以科学计数法输出时却出现问题,代码如下:
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是怎么回事,怎么会输出这个东西来?
5.2165E-4 就是 5.2165/10000
E-4就是10的-4次幂
输入:一个比较小的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);
}
希望该回答对楼主有用