java - 两个长值之和返回负值
问题描述
我已经编写了代码来完成后缀评估,除非我试图处理下面的情况,我继续得到一个负值,我知道这是不正确的。为什么我得到这个负数,我如何得到 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
解决方案
你得到了负值,因为你超过了 along
可以容纳的最大值。当您超过最大值时,它会从最小值重新开始,直到超过最大值的数量。当您尝试将小于最小值的数字分配给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");
推荐阅读
- java - 如何在java中以并行数组加载文件
- javascript - UWP WebView:在没有源的情况下最小化窗口时播放音频
- python - 在 Pygame 中,图像不会出现在屏幕上
- spring-boot - Katalon disqus textArea 对象无法识别
- javascript - 如何在 Vigenere Cipher 中维护大小写并忽略空格
- java - Vert.x POST 回调未触发
- cron - Ubuntu EasyEngine 条件执行
- excel - 在 Excel 宏上实时运行函数
- visual-studio - 双击 Visual Studio 2019 时如何禁用编辑项目?
- c# - 从继承 networkBehviour 的类继承