string - 在不使用解析的情况下在java中加倍

时间:2013-09-13 23:13:28

标签: java

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

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循环应该导致字符串的小数部分。我很难,因为双倍结果导致巨大的十进制数,并且它破坏了转换,并且第二个while循环打印出错误的答案。

3 个答案:

答案 0 :(得分:1)

int exp1=num.length();

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

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

答案 1 :(得分: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.000000,0505.000,.12和124023211.123 当然,你不会总是得到确切的值,因为有时它会被写为double的表达式,就像你提供的数字一样。并且有些数字在二元系统中没有任何表示。

答案 2 :(得分: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;
    }
}

Gautam Sonar