【问题标题】:String-Double not working for negative numbersString-Double 不适用于负数
【发布时间】:2013-09-14 08:20:08
【问题描述】:
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,因为我们不允许这样做。

【问题讨论】:

  • 对于负数,输出/错误是什么?
  • 它打印一个不同的数字。
  • 您可能需要考虑这样一个事实,即当数字前加负号时,您期望的指数位置会有所不同
  • @prasanth :即使是家庭作业,他也至少想出了这么多代码。所以帮助他并没有错。我希望你会同意。 :)
  • 谁说我不会帮忙??我刚问过。

标签: java


【解决方案1】:
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;

 }

我按照我解决这个问题的方式重写了它。如果您还记得我在您的其他问题上发布了伪代码,这是我的“编程”版本。

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

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

它遍历数组并检查是否存在.,如果存在,它将十进制变量设置为真而不是假。如果它在字符串中读取多个小数点,它将返回一个0.0,我将其表示为失败值。但是,如果它不再拾取小数,它会增加指数值以查看需要跳转多少个空格。

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

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

其他的一切都是不言自明的。

注意:

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

【讨论】:

  • 请问if(decimal) return 0.0这个语句的用法?
  • @BlackPanther 本质上是一个错误检查。如果它检测到多个.,那将是一个无效字符串3.333.3不是小数,所以它返回一个null,在这种情况下我将它表示为0.0
  • 哦,太好了.. :) 但是如果这个 int count = a.length() - a.replace(".", "").length(); 被实现并且在 for 循环之前对计数进行检查,可以节省时间,因为如果输入 3.333.3 我们不会浪费时间通过不必要地解析 5 个字符:)
  • @BlackPanther .replace 是一个线性运算,我们将增加更多复杂性。现在的复杂性(不包括 pow 函数)将是0(n),如果我们包括它将是0(n+n)
  • 老兄有一分钟我就像“说什么?”与所有那些大 O 和东西......但是,我明白你的意思......谢谢你的信息...... +1 :)
【解决方案2】:
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()

【讨论】:

  • 你确定在一个地方声明所有变量是一个约定吗?我认为是在“Effective Java”中推荐了相反的内容。
  • @IgorRodriguez :我的立场已得到纠正……对于错误信息,我深表歉意。
  • @IgorRodriguez :我相信惯例是在立即使用变量之前声明它。或在将要使用它的块的开头。感谢您的提示,它让我查了一下 :) +1
【解决方案3】:
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;
}
}

【讨论】:

  • 您在问题stackoverflow.com/questions/4378455/… 中基本上做了三个 0(n) 操作
  • 哈哈。我确实检查输入的格式是否有效(与您的解决方案不同)。但是,这并不影响代码的渐近时间复杂度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多