字符串数学算法错误的JavaFX

时间:2017-08-03 05:02:02

标签: java algorithm math javafx

当我构建我的第一个JavaFX项目时,我注意到我构建的计算器引擎有点过时了。话虽如此,我现在花了大约一个小时检查了我的代码,试图弄清楚出了什么问题,我找不到任何与我程序中这个奇怪的bug有关的东西。

计算器引擎:

public static String BasicEval(String str, String function) {
    int indexOfOperation = str.indexOf(function);
    int downBoundary = indexOfOperation - 1;
    int upBoundary = indexOfOperation + 1;
    int closestUp = str.length(), closestDown = 0;

    for (int index = 0; index < str.length(); index++) { // Searching for the closest white space (between vals.) to determine what are the two vals.
        if (Math.abs(indexOfOperation - index) == 1) {
            continue;
        } else if ((str.charAt(index) == ' ') && ((indexOfOperation - index) > closestDown)) {
            closestDown = index; //Finds the closest blank space in order to differentiate between elements.
        } else if ((str.charAt(index) == ' ') && (Math.abs(indexOfOperation + index) < closestUp)) {
            closestUp = index; //Finds the closest black space in order to differentiate between elements.
        }
    }
    while (str.substring(upBoundary,closestUp).contains("X") || (str.substring(upBoundary,closestUp).contains("-") || (str.substring(upBoundary,closestUp).contains("+") || (str.substring(upBoundary,closestUp).contains("/") || (str.substring(upBoundary,closestUp).contains("^")))))) {
        closestUp--;
    }

    double firstValue = Double.valueOf(str.substring((closestDown + 1), downBoundary));
    double secondValue = Double.valueOf(str.substring(upBoundary + 1, (closestUp-1)));

    double OperationResult;
    switch (function) {
        case "^" : OperationResult = Math.pow(firstValue,secondValue); break;
        case "X" : OperationResult = (firstValue * secondValue); break;
        case "/" : OperationResult = (firstValue / secondValue); break;
        case "+" : OperationResult = (firstValue + secondValue); break;
        case "-" : OperationResult = firstValue - secondValue; break;
        default: OperationResult = -999.12349876; //ERROR
    }

    str = strSort(str,firstValue,secondValue,OperationResult);

    return str;

}

关于引擎的一点点:引擎本身假设评估字符串中的数学表达式,所以例如输入将是:&#34; 3 + 4&#34;答案是:7.0作为双倍。我希望实现这一目标的方法是通过术语和操作符号之间的空格将str分成4个较小的部分。问题是:当您使用更大的数字时,数学会变得非常奇怪。数字-999.123 ...代表程序中的错误。

对于使用较少数字的简单计算,引擎工作得很好,但是当你开始使用更大的数字时,事情会变得混乱。有时它也会产生错误,如:&#34;空字符串&#34;,我不明白为什么......

有关项目或引擎的更多信息,请发表评论。 - 请记住,我正在寻找适用于我的算法的答案,而不是一般的javaFX - (尽管我喜欢学习新东西) 谢谢 !!

事情不应该是这样的例子: enter image description here enter image description here

我会在评论中发布更多图片。

strSort方法

public static String strSort(String str, double firstValue, double secondValue, double result) {
    //Method that sorts between which vals are ints and which ones are doubles. --> returns them in their current form.
    int firstValueIndex = 0;
    int secondValueIndex = 0;

    if (!intOrDoubleTest(firstValue) && firstValue == secondValue){ // Special category : indexOf doesn't work since the two vals. are the same --> giving off the same index.
        firstValueIndex = str.indexOf(Double.toString(firstValue));
        secondValueIndex = str.indexOf(Double.toString(secondValue),firstValueIndex+1);
    } else if (intOrDoubleTest(firstValue) && firstValue == secondValue) { // Special category : indexOf doesn't work since the two vals. are the same --> giving off the same index.
        firstValueIndex = str.indexOf(Integer.toString(intValue(firstValue)));
        secondValueIndex = str.indexOf(Integer.toString(intValue(secondValue)),firstValueIndex+1);
    } else if (intOrDoubleTest(firstValue) && intOrDoubleTest(secondValue)) { // First, sorts out the two vals.
        firstValueIndex = str.indexOf(Integer.toString(intValue(firstValue)));
        secondValueIndex = str.indexOf(Integer.toString(intValue(secondValue)));
    } else if (!intOrDoubleTest(firstValue) && intOrDoubleTest(secondValue)) {
        firstValueIndex = str.indexOf(Double.toString(firstValue));
        secondValueIndex = str.indexOf(Integer.toString(intValue(secondValue)));
    } else if (intOrDoubleTest(firstValue) && !intOrDoubleTest(secondValue)) {
        firstValueIndex = str.indexOf(Integer.toString(intValue(firstValue)));
        secondValueIndex = str.indexOf(Double.toString(secondValue));
    } else if (!intOrDoubleTest(firstValue) && !intOrDoubleTest(secondValue)) {
        firstValueIndex = str.indexOf(Double.toString(firstValue));
        secondValueIndex = str.indexOf(Double.toString(secondValue));
    }

    String strToReplace = str.substring(firstValueIndex, secondValueIndex); // Computing the range that need to be replaced.

    if (intOrDoubleTest(result)) {
        int intResult = intValue(result);
        str = str.replace(strToReplace,Integer.toString(intResult));
    } else if (!intOrDoubleTest(result)) {
        str = str.replace(strToReplace,Double.toString(result));
    }
    return str;
}
public static boolean intOrDoubleTest(double value) {
    return (value % 1 == 0); // True = val is Int, False = val is Double.
}

1 个答案:

答案 0 :(得分:-1)

发现问题:

问题出在strTort方法的strToReplace.substring中。很自然地,我以更简单,更好的方式重写了整个方法。

public static String strSort(String str, double firstValue, double secondValue, double result) {
    //Method that sorts between which vals are ints and which ones are doubles. --> returns them in their current form.
    int firstValueIndex;
    int secondValueIndex;

    if (intOrDoubleTest(firstValue)) {
        firstValueIndex = str.indexOf(Integer.toString(intValue(firstValue)));
    } else {
        firstValueIndex = str.indexOf(Double.toString(firstValue));
    }
    if (intOrDoubleTest(secondValue)) {
        secondValueIndex = str.indexOf(Integer.toString(intValue(secondValue)), firstValueIndex+1);
    } else {
        secondValueIndex = str.indexOf(Double.toString(secondValue), firstValueIndex+1);
    }

    int lengthOfSecondVal;
    lengthOfSecondVal = (int)(Math.log10(secondValue)+1);

    String strToReplace = str.substring(firstValueIndex, secondValueIndex+lengthOfSecondVal); // Computing the range that need to be replaced.

    if (intOrDoubleTest(result)) {
        int intResult = intValue(result);
        str = str.replace(strToReplace,Integer.toString(intResult));
    } else if (!intOrDoubleTest(result)) {
        str = str.replace(strToReplace,Double.toString(result));
    }
    return str;
}
public static boolean intOrDoubleTest(double value) {
    return (value % 1 == 0); // True = val is Int, False = val is Double.
}

感谢所有帮助过的人!