进制的转换 不知道那里错了

loulanhaojie 2010-03-24 04:55:35
写了一段代码 是把0到1之间的8进制数转化为十进制数的
import java.util.*;
public class Test3 {
public Test3(){
Scanner in = new Scanner(System.in);
double m = in.nextDouble();
String s = String.valueOf(m);
double e = (double)1/8;
double total =0.00;
for(int i = 2;i<s.length();i++){
total += (s.charAt(i)-48)*e;
e *= e;
}
System.out.println(total);
}
public static void main(String[] args){
new Test3();
}
}
执行的时候发现有时会出错
比如0.001
0.01234567
不知道如何改进
请各位给点意见
谢谢
~~
...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
heruoyong 2010-03-24
  • 打赏
  • 举报
回复
//0.0001=1.0E-4
String s = String.valueOf(m);

出问题就在这里,主要是当为0.0001的时候,s为1.0E-4了,所以这里分两种情况来做这件事情
heruoyong 2010-03-24
  • 打赏
  • 举报
回复
package mars.test;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ConvertOctalToDecimal {

public static final String EMode="^(\\d)\\.(\\d)E-(\\d+)$";


public ConvertOctalToDecimal() {

Scanner in = new Scanner(System.in);
double m = in.nextDouble();

double e = 0.125d;
double total = 0.00d;
if (m > 0 & m < 1) {
//0.001=1.0E-4
String s = String.valueOf(m);

if(Pattern.matches(EMode,s))
{
Matcher matcher = Pattern.compile(EMode).matcher(s);
String one=null;
String two=null;
String three=null;

while(matcher.find())
{
one = matcher.group(1);
two = matcher.group(2);
three = matcher.group(3);
}
//
total=Integer.parseInt(one)*1d;

for(int i=0;i<two.length();i++)
{
total +=(s.charAt(i) - 48)*e;
e*=0.125d;
}
total*=Math.pow(8d,-Integer.parseInt(three));
}
else
{
for (int i = 2; i < s.length(); i++) {
total += (s.charAt(i) - 48)*e;
e *= 0.125d;
}
}
}
System.out.println(total);
}

public static void main(String[] args) {
new ConvertOctalToDecimal();

}
}
明留 2010-03-24
  • 打赏
  • 举报
回复
e *= (double)1/8;
loulanhaojie 2010-03-24
  • 打赏
  • 举报
回复
刚试了下 你输入0.0001试试
结果是
0.3232421875
loulanhaojie 2010-03-24
  • 打赏
  • 举报
回复
有更简洁的代码吗??
有的话给个吧
~~
heruoyong 2010-03-24
  • 打赏
  • 举报
回复
import java.util.*;

public class Test3 {

public Test3() {
Scanner in = new Scanner(System.in);
double m = in.nextDouble();

double total = 0.00;
if (m > 0 & m < 1) {
String s = String.valueOf(m);
double e = (double) 1 / 8;

for (int i = 2; i < s.length(); i++) {
total += (s.charAt(i) - 48) * e;
e *= (double)1/8;
}
}
System.out.println(total);
}

public static void main(String[] args) {
new Test3();
}
}
heruoyong 2010-03-24
  • 打赏
  • 举报
回复
e *= e;
e *= (double)1/8;

62,614

社区成员

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

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