2

前段时间在一次采访中被问到这个问题,我无法弄清楚。我不被允许一次全部转换,所以我的下一个想法是只运行字符串转换直到这一点,但采访我的人告诉我他想做这样的事情:

1 = 1 
12 = 1 * 10 + 2 
123 = 12 * 10 + 3 
1234 = 123 * 10 + 4

输入是convert "1234.567" to a float ie. 1234.567

老实说,我不知道他是怎么做的,我也无法编写足够好的代码来向你们展示我所拥有的只是循环解析每个字符:

for(int i = 0; i < str.length(); i++){
        if(!str.charAt(i).equals(".")){
            fp = Float.parseFloat("" + str.charAt(i));
4

6 回答 6

3

像这样的东西(注意:没有错误检查):

public float parseFloatFromString(final String input)
{
    boolean seenDot = false;
    float divisor = 1.0f;
    char c;
    float ret = 0.0f;

    for (int i = 0; i < input.length(); i++) {
        c = input.charAt(i);
        if (c == '.') {
            seenDot = true;
            continue;
        }
        ret *= 10.0f;
        ret += (float) (c - '0');
        if (seenDot)
            divisor *= 10.0f;
    }

    ret /= divisor;
    return ret;
}

当然,您受到 afloat可以表示为十进制数字的限制——最终,不多。尤其是在这种情况下,您一直在乘法/加法,我们不要谈论最终除法(如果除数不是 1)。

关于上述内容的有趣说明:事实上,这似乎在不同平台上会产生不同的结果......现代平台上的现代 JVM 可能使用内部的、更高精度的浮点中间表示。如果你想在任何地方都得到相同的结果,你必须strictfp在方法声明中添加修饰符:

public strictfp float parseFloatFromString(final String input)

更多细节在这里

于 2014-02-26T01:56:07.877 回答
0

我不明白你的意思是什么?你的意思是将'123456'这样的整数转换为'12345 * 10 + 6'吗,如果你想这样做,只需使用'substring'方法来做到这一点。

于 2014-02-26T01:54:13.140 回答
0

这不是特别优雅,但确实有效。

    String s = "1234.567";
    Float fp = 0f;
    Float fpd = 0f;
    int i =0;
    while(s.charAt(i) != '.') {
            fp = (fp * 10) + Float.parseFloat(s.substring(i, (i+1)));
            i++;
        }
    int d = s.indexOf('.');
    for(i = s.length()- 1; i > d; i--) {
        fpd = (fpd * 0.1f) + (Float.parseFloat(s.substring(i, (i+1))) * 0.1f);  
    }
    fp += fpd;
    System.out.println(fp);
于 2014-02-26T02:40:12.567 回答
0

要将字符串转换为浮点数,我个人使用这个:

Float.parseFloat("1234.567");

对于这个家伙想要的,这将是我的做法:

String num = "1234.567";

int dotLocation = num.indexOf(".");
int wholeNum = Integer.parseInt(num.substring(0, dotLocation)); 

String answer = (wholeNum / 10) + " * 10 + " + (wholeNum % 10); 

找到“。”的位置。在字符串中,然后通过获取原始字符串的子字符串来提取整数。这将给我们 1234。

然后我们需要对其进行格式化,使得我们得到 1234 = 123 * 10 + 4。

从数学上讲,当您将 1234 除以 10 时,商将为 123,余数为 4。这将为您提供这个人想要的答案。

于 2014-02-26T02:41:16.193 回答
0

您可能希望修剪源字符串,然后一次创建一个数字,同时计算可选小数点后出现的位数(以便您可以缩放结果数字)。

public class MakeFloat {

private static MakeFloat me;

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    me = new MakeFloat();
    String source = " 1234.567";
    float result = me.start(source);
    System.out.println(" " + source + "=" + result);
}

private float start(String string) {
    final String digits = "0123456789";
    final float[] values = {0,1,2,3,4,5,6,7,8,9};
    float ten = 10;

    float result = 0;
    float scale = 1;
    boolean isAfterDecimal = false;

    String stepThrough = string.trim();

    for (int i = 0; i < stepThrough.length(); i++) {
        // see if we have a digit or a decimal point
        String digit = stepThrough.substring(i, i + 1);
        int loc = digits.indexOf(digit);
        if (loc > -1) {
            result = ten * result + values[loc];
            if (isAfterDecimal) {
                scale = scale * ten;
            }
        } else if (".".equals(digit)) {
                  if (isAfterDecimal) {
                    // handle error
                  } else {
                    isAfterDecimal = true;
                  }
        } else {
                // handle bad character
        }
    }
    return result / scale;
}
}
于 2014-02-26T02:57:12.353 回答
0

包 com.nanofaroque.float2String;

公共类 Float2String {

public static void main(String[] args) {
    String input="1234.56";
    String str=".";
    float result=0;
    int j=3;//this is used for multiply by 10^j

    for(int i=0;i<input.length();i++){
        if (input.charAt(i)!=str.charAt(0)){
            char m=input.charAt(i);//Convert String to Character
            float x=(float) input.charAt(i);//Getting the ASCI value
            x=x-48;//Now x converted to the real float value
            float y=(float) (x* (Math.pow(10, j)));//Multiplication Operation for conversion
            result=result+y;
            j=j-1;
                        }
        else{
            System.out.println("Welcome to my World");// to make the loop work..You can change it if you want
        }
    }
    System.out.println("Result after the conversion:"+result);
}

}

于 2014-02-26T03:59:22.990 回答