-1

我需要创建一个将字符串转换为双精度的程序。

public class Convert{
  public static void main(String args[]){
    String num="124023211.123";
    int d=0,g=0,c=0,fnl=0,h=0,v=0;
    double fnl2=0;
    int exp=(num.indexOf(".")-1);
    while(num.charAt(d)!='.'){
        g=num.charAt(d)-48;
        int k = 1;
        for(int f=0;f<exp;f++){
            k=(k*10);
        }
        fnl+=(k*g);
        d++;
        exp--;
    }
    num=(num.substring(d+1) );
    //System.out.println(fnl);
    //System.out.println(num);

    while(h!=num.length()){
      v=num.charAt(h)-48;
      double j=1;
      int exp1=num.length();
      for(int f1=0;f1<exp1;f1++){
        j*=.10;
      }
      fnl2+=(h*j);
      j++;
      h++;
    }
    System.out.println(fnl2);
  }
}

第一个 while 循环转换字符串的 int 部分并且它工作正常。但是第二个 while 循环应该导致字符串的小数部分。我很难过,因为 double 结果会产生巨大的十进制数字,它会破坏转换,而且第二个 while 循环也会打印错误的答案。

4

3 回答 3

1
int exp1=num.length();

这条线是您问题的一部分。您的循环将始终循环 num.length() 次,但 num 的长度没有变化(在您的情况下始终为 3)。这导致所有三个数字都被视为千分之一。

另外,请记住十进制值不能以 IEEE-754 格式精确表示。通过执行所有这些乘法和加法,您将错误引入结果中。Double.Parse 将为您的数字提供最佳近似值。

于 2013-09-13T23:20:00.117 回答
0

您可以执行以下操作

String s="124023211.123";
int i;
double result = 0.0f, result2 = 0.0f;
for (i = 0; i < s.length(); i++)
  if (s.charAt(i) == '.')
    break;
  else
    result = result * 10 + (s.charAt(i) - '0');

for (i = s.length()-1 ; i>=0 ; i--)
  if (s.charAt(i) == '.')
    break;
  else
    result2 = result2 / 10 + (s.charAt(i) - '0');

if (i>=0)
  result += result2/10;

测试:11、3.0、6.00000、0005.000、.12 和 124023211.123 当然,您不会总是得到准确的值,因为有时它会写成双精度表达式,就像您提供的数字一样。还有一些数字在二进制系统中没有表示。

于 2013-09-13T23:50:16.210 回答
0

试试这个,它工作正常,测试有效数据

public class Sample1 {
    public static void main(String args[]){
        String num="122312312.2331231";
        String s1 = num.substring(0,num.indexOf("."));
        String s2 = num.substring(num.indexOf(".") + 1,num.length());
        System.out.println(s1);
        System.out.println(s2);
        double n1 = 0;
        double n2 = 0;
        for(int i=0;i<s1.length();i++){
            double d = s1.charAt(i) - '0';
            n1 = n1*10;
            n1 += d;
        }
        System.out.println(n1);
        for(int i=0;i<s2.length();i++){
            double d = s2.charAt(i) - '0';
            //n2 = n2/;
            n2 += d/number(i+1);
        }
        System.out.println(n1+n2);
    }
    public static long number(int n2){
        long d = 10l;
        if(n2>1)
        d =  10 * number(n2-1);
        return d;
    }
}

高塔姆声纳

于 2015-02-15T19:10:44.717 回答