请高手帮菜鸟看看这段代码!!!!!!!!

gialimyo 2009-02-19 10:02:53
今天做做练习题时发现了一个问题:
这道题是将一个数据以三种格式输出,可是最后一个方法,即以科学计数法输出时却出现问题,代码如下:
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是怎么回事,怎么会输出这个东西来?
...全文
200 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdsww009 2009-02-20
  • 打赏
  • 举报
回复
学习了
gialimyo 2009-02-19
  • 打赏
  • 举报
回复
你回答得很好啊~
gialimyo 2009-02-19
  • 打赏
  • 举报
回复
你解释得非常好,本来理应得到更多的分数,但为了鼓励二楼的新人(其实他也是正解),只好平分,希望见谅。
happy1986 2009-02-19
  • 打赏
  • 举报
回复
楼上:整数---> 正数
happy1986 2009-02-19
  • 打赏
  • 举报
回复
其实楼主的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);
}


希望该回答对楼主有用。。。
zhangbo1983 2009-02-19
  • 打赏
  • 举报
回复
第一次回答问题希望满意哦
zhangbo1983 2009-02-19
  • 打赏
  • 举报
回复
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次幂
zhangbo1983 2009-02-19
  • 打赏
  • 举报
回复
==========================
「已注销」 2009-02-19
  • 打赏
  • 举报
回复
我觉得你应该加一些注释,那样会好点

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧