为什么这个数字解析器没有正确解析双精度数?

时间:2015-12-27 16:53:33

标签: java parsing

我写了一个基本的数字解析器,我认为它应该适用于双精度和整数。但是,当调用解析数字时,它只适用于int类型,当数字是double(它通过达到小数点而知道)时,它只是停止解析。有人可以告诉我这段代码有什么问题:

(注意:解析器正在解析先前读入char数组的文件中的数字。我知道文件的内容正确读入数组,因为我打印了数组内容并且包含正确的内容)

我的号码解析器功能:

NumReturn numberParser(int cIndex) { // current index of array where num is
    // found
    int num = 0;
    double dnum;
    // int[] result = new int[2];
    while (Character.isDigit(Lexer.fileContents[cIndex]) == true) {
        num = num * 10 + Character.getNumericValue(Lexer.fileContents[cIndex]);
        System.out.println(num);
        cIndex++;
        if (cIndex >= Lexer.fileContents.length)
            break;
    }

    try {
        if (Lexer.fileContents[cIndex] == '.') {
            dnum = (double) num;
            int n = 1;
            while (Character.isDigit(Lexer.fileContents[cIndex++]) == true) {
                dnum = dnum + Character.getNumericValue(Lexer.fileContents[cIndex]) / (10 * n);
                n++;
                System.out.println(dnum);
                cIndex++;
                if (cIndex >= Lexer.fileContents.length)
                    break;
            }
            System.out.println("Double Value:" + dnum);
            return new NumReturn(dnum, cIndex);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("Int Value:" + num);
    return new NumReturn(num, cIndex);

}

NumReturn类: //即使你可能不需要看到这个

package jsmash;

public class NumReturn {
    int value;
    double dvalue;
    int pointerLocation;
    NumReturn(int value, int pointerLocation) {
        this.value = value;
        this.pointerLocation = pointerLocation;
    }
    NumReturn(double dvalue, int pointerLocation) {
        this.dvalue = value;
        this.pointerLocation = pointerLocation;
    }
}

测试用例:

323 --> parses correctly and prints 323
323.54 --> stops parsing after the decimal and prints 323.0 

2 个答案:

答案 0 :(得分:2)

问题在于这句话:

dnum = dnum + Character.getNumericValue(Lexer.fileContents[cIndex]) / (10 * n);

/运算符具有更高的优先级,因此将其评估为:

dnum = dnum + (Character.getNumericValue(Lexer.fileContents[cIndex]) / (10 * n));

/运算符的两边都是int类型,因此这是一个整数除法。你正在划分一个数字< 10由数字> = 10,所以你总是得到0作为整数除法截断。您需要将至少一个操作数设为double,然后它将执行浮点除法。但是,这不是问题的结束。你的代码除以10,20,30,....你希望它除以10,100,1000 ......而且,你正在推进cIndex两次:在while条件内,再在循环中。你应该只做一次。

        ++cIndex; // Advance past the decimal point.
        double n = 10;
        while (Character.isDigit(Lexer.fileContents[cIndex])) {
            dnum += Character.getNumericValue(Lexer.fileContents[cIndex]) / n;
            n *= 10;

答案 1 :(得分:1)

尝试更改此行:

dnum = dnum + Character.getNumericValue(Lexer.fileContents[cIndex]) / (10 * n);

为:

dnum = dnum + (Character.getNumericValue(Lexer.fileContents[cIndex]) * 1.0) / (10 * n);

在您当前的代码中,您将Character.getNumericValue(Lexer.fileContents[cIndex])除以int除以double - 这总是等于0.0