Сумма двух длинных значений возвращает отрицательное значение - PullRequest
0 голосов
/ 28 октября 2019

Я написал код для завершения оценки постфикса, за исключением случаев, когда я пытаюсь обработать приведенный ниже случай, я продолжаю получать отрицательное значение, которое, как я знаю, неверноПочему я получаю это отрицательное число и как мне получить правильный вывод 18000000000000000000? Я разместил свой код ниже, и любая помощь будет принята с благодарностью.

     public static Number postfixEvaluate(String e){
    Long number1;
    Long number2;
    Number result = new Long(0);

    Stack<Number> stack = new Stack();

    String[] tokens = e.split(" ");

        for(int j = 0; j < tokens.length; j++){
            String token = tokens[j];
            //System.out.println(tokens[j]);
        if (!"+".equals(token) && !"*".equals(token) && !"-".equals(token) && !"/".equals(token) && !"".equals(token))  {
            stack.push(Long.parseLong(token)); 

    }  else if ("".equals(token)) {
        System.out.println(token);
    } else {
            String Operator = tokens[j];
            number2 = (Long) stack.pop();
            System.out.println(number2);
            number1 = (Long) stack.pop();
            System.out.println(number1);
            if (Operator.equals("/")){
                result = number1 / number2;
                System.out.println(result);
            }
            else if(Operator.equals("*")){
                result = number1 * number2;
                System.out.println(result);
            }
            else if(Operator.equals("+")){
                result = Long.sum(number1, number2);
                System.out.println("Addition of: " + number1 + "+ " + number2 + "= " + result);
            }
            else if(Operator.equals("-")){
                result = number1 - number2;
            System.out.println(result);
            }
            else System.out.println("Illeagal symbol");
            stack.push(result);
        }
        }

                stack.pop();


    //s.pop();
    System.out.println("Postfix Evauation = " + result);

        return result;
   }

Мой ввод и вывод:

   Input: 9000000000000000123 9000000000000000987 +
   Expected Output: 18000000000000000000
   Current Output: -446744073709550506

1 Ответ

2 голосов
/ 28 октября 2019

Вы получили отрицательное значение, поскольку вы превысили максимальное значение, которое может содержать long. Когда вы превышаете максимальное значение, оно начинается снова с минимального значения до числа, превышающего максимальное значение. То же самое верно и для случая, когда вы пытаетесь присвоить число, меньшее минимального значения, переменной long. Чтобы понять это, вы можете посмотреть на вывод следующей программы:

public class Main {
    public static void main(String[] args) {
        System.out.println("Long.MAX_VALUE: "+Long.MAX_VALUE);
        System.out.println("Long.MIN_VALUE: "+Long.MIN_VALUE);
        long x = Long.MAX_VALUE + 1;
        long y = Long.MIN_VALUE - 1;
        System.out.println("Long.MAX_VALUE + 1: "+x);//will be assigned the value of Long.MIN_VALUE
        System.out.println("Long.MIN_VALUE - 1: "+y);//will be assigned the value of Long.MAX_VALUE

        x = Long.MAX_VALUE + 2;
        y = Long.MIN_VALUE - 2;
        System.out.println("Long.MAX_VALUE + 2: "+x);//will be assigned the value of Long.MIN_VALUE + 1
        System.out.println("Long.MIN_VALUE - 2: "+y);//will be assigned the value of Long.MAX_VALUE - 1

    }
}

Вывод:

Long.MAX_VALUE: 9223372036854775807
Long.MIN_VALUE: -9223372036854775808
Long.MAX_VALUE + 1: -9223372036854775808
Long.MIN_VALUE - 1: 9223372036854775807
Long.MAX_VALUE + 2: -9223372036854775807
Long.MIN_VALUE - 2: 9223372036854775806

Для ваших требований вам понадобится BigIntegerнапример,

BigInteger bi = new BigInteger("18000000000000000000");
...