String-Double不适用于负数

时间:2013-09-14 08:20:09

标签: java

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

        }

        num=(num.substring(d) );

         double num1= Double.parseDouble(num); 
         double finalnum=(fnl+num1);
         System.out.println(fnl);
         if(num2.charAt(0)=='-'){
             finalnum*=-1;
         }

    }
}

我创建了自己的方法来转换字符串的整数部分,它只适用于正数。 :(它应该适用于正数和负数。并且我使用parse double来转换小数点后的数字。我不能使用parse double将整个字符串转换为double,因为我们不允许这样做。

3 个答案:

答案 0 :(得分:2)

public static double toDouble(String a){
     int sign = 1;
     int start = 0;
     if(a.charAt(0) == '-'){
         start = 1;
         sign = -1;
     }
     double value = 0;
     boolean decimal = false;
     int exp = 0;

     for(int i = start; i < a.length(); i++){
         if(a.charAt(i) == '.'){
             if(decimal) return 0.0;
             decimal = true;
         }else{
             value += (a.charAt(i) - 48) * Math.pow(10,a.length() - i - 1);
         }

         if(decimal) exp++;
     }

     value =  value / Math.pow(10,exp);
     value *= sign;
      System.out.println(value);
     return value;

 }

我有点改写它我会做这个问题的方式。如果你还记得我在你的另一个问题上贴了psuedo代码,这就是我的#34;编程&#34;版。

这就是我的代码的工作方式。

首先,它检查第一个字符[0]处的符号,然后将start位置增加到1而不是零,以启动超过-符号的循环。

它循环遍历数组并检查是否有.,如果是,它将十进制变量设置为true而不是false。如果它读取字符串中的多个小数点,它将返回0.0,我将其表示为失败值。但是,如果它不再获取小数,则递增指数值以查看跳转所需的空格数。

value += (a.charAt(i) - 48) * Math.pow(10,a.length() - i - 1);

这行代码非常有趣。 a.charAt(i) - 48将字符转换为整数值。 然后我乘以10 ^(该值为10的幂,然后减去1以补偿1.0)。然后我加上它值。

其他一切都非常自我解释。

注意:

我自己测试了这段代码,但重要的是我没有添加对其他字符的无效字符串的检查。

答案 1 :(得分:1)

int g=0,fnl=0;
String input  = "-12.0";
String temp = input;
String forDecimalPart = input;
if(input.charAt(0)=='-') {
    temp=input.substring(1);
}

int exp = temp.indexOf(".");
System.out.println(exp);
int d=0;
while(temp.charAt(d)!='.') {
    g=temp.charAt(d)-48;
    int k = 1;
    for(int f=1;f<exp;f++) {
      k*=10;
    }
    fnl+=(k*g);
    d++;
    exp--;
    System.out.println(fnl);
}

forDecimalPart=temp.substring(d) ;

double num1= Double.parseDouble(forDecimalPart); 
double finalnum=(fnl+num1);
if(input.charAt(0)=='-'){
finalnum*=-1;
}
System.out.println(finalnum);

我已经给你答案,因为你已经努力想出至少这个代码。 祝好运 :) 我编写了类似于您的问题的代码,而没有添加其他类的其他方法,如Math.pow()

答案 2 :(得分:1)

import java.util.regex.*;

public class DoubleParse{

public static void main(String[] args)
{

    String[] doubles = "12.3 4.08 5 -5 -5.4 4.0 0 0.0 5.800 asda".split(" ");
    for (String num: doubles)
    {
        System.out.println(parse_double(num));
    }
}


final static Pattern double_format = Pattern.compile("^(\\-?)[0]*([0-9]+)(?:\\.([0-9]+?)[0]*)?$");


public static double parse_double(String num)
{

    Matcher m = double_format.matcher(num);
    if (!m.matches())
        throw new IllegalArgumentException(num+" is not in proper format!");

    int sign = num.charAt(0)=='-'? -1 : 1;
    int point = num.indexOf('.');
    int whole = parse_int(num.substring(sign==-1? 1 : 0, (point!=-1)? point : num.length()));
    double fraction=0;
    if (point != -1)
    {
        String fractionS = num.substring(point+1);
        fraction = parse_int( fractionS)/Math.pow(10, fractionS.length());
    }
    return (whole+fraction)*sign;
}

public static int parse_int(String numS)
{
    int num=0;
    for (int i=0;i<numS.length();i++)
    {
        num *= 10;
        num += (int) (numS.charAt(i)-'0');
    }
    return num;
}
}