减法和除法运算的十六进制计算器问题
hexadecimal calculator issue with subtraction and division operation
我有一个应用程序 Base 计算器,但我遇到了两个基本十六进制数之间的减法问题。如果一个(大数减去一个小数)它给出了正确的结果。
问题是当操作(小数减大数)例如:(1 - 22 或 1a - 22)应用程序崩溃并关闭时。
十六进制的方法是:
private void hexa_calc() {
int num = 0;
int num1 = Integer.parseInt(e_one.getText().toString().trim(),16);
int num2 =Integer.parseInt(e_two.getText().toString().trim(),16);
if (appKey1.operation.equals("+")) {
String value = Integer.toHexString(num1 + num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else if (appKey1.operation.equals("-")) {
String value = Integer.toHexString(num1 - num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else if (appKey1.operation.equals("X")) {
String value = Integer.toHexString(num1 * num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else {
String value = Integer.toHexString(num1 / num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
}
}
除法运算的第二个问题是它给出了(结果 = 0)它不是这样的 0.12324,零后没有小数。
我该如何解决这个代码?
- 当您将负整数转换为十六进制字符串时,您会得到数字加上 2^32 的十六进制表示形式。例如,
Integer.toHexString(-3)
给你 fffffffd
。您应该直接将结果字段设置为此值,但您却试图将此字符串转换回整数并再次转换为十六进制字符串。这对额外的和不必要的转换失败了。它失败了,因为十六进制数 fffffffd
太大而无法用整数表示。它只能适合Long。所以,
Integer.parseInt(Integer.toHexString(-3), 16);
java.lang.NumberFormatException 失败,但是
Long.parseLong(Integer.toHexString(-3), 16);
得到 4294967293,即 2^32 - 3。
TLDR,您应该避免将结果转换为整数并返回到十六进制字符串。将您的代码简化为
String value = Integer.toHexString(num1 - num2);
t_result.setText(value);
其他运算也是如此,不仅仅是减法。
- 除法的问题是结果的类型是整数。当然,整数结果不能有任何小数部分。您应该使用 double 来保存结果。
例如:
String value = Double.toHexString((double)num1 / num2);
t_result.setText(value);
这会给你小数部分。
我有一个应用程序 Base 计算器,但我遇到了两个基本十六进制数之间的减法问题。如果一个(大数减去一个小数)它给出了正确的结果。 问题是当操作(小数减大数)例如:(1 - 22 或 1a - 22)应用程序崩溃并关闭时。
十六进制的方法是:
private void hexa_calc() {
int num = 0;
int num1 = Integer.parseInt(e_one.getText().toString().trim(),16);
int num2 =Integer.parseInt(e_two.getText().toString().trim(),16);
if (appKey1.operation.equals("+")) {
String value = Integer.toHexString(num1 + num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else if (appKey1.operation.equals("-")) {
String value = Integer.toHexString(num1 - num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else if (appKey1.operation.equals("X")) {
String value = Integer.toHexString(num1 * num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
} else {
String value = Integer.toHexString(num1 / num2);
num = Integer.parseInt(value, 16);
t_result.setText(String.valueOf(Integer.toHexString(num)));
}
}
除法运算的第二个问题是它给出了(结果 = 0)它不是这样的 0.12324,零后没有小数。
我该如何解决这个代码?
- 当您将负整数转换为十六进制字符串时,您会得到数字加上 2^32 的十六进制表示形式。例如,
Integer.toHexString(-3)
给你fffffffd
。您应该直接将结果字段设置为此值,但您却试图将此字符串转换回整数并再次转换为十六进制字符串。这对额外的和不必要的转换失败了。它失败了,因为十六进制数fffffffd
太大而无法用整数表示。它只能适合Long。所以,
Integer.parseInt(Integer.toHexString(-3), 16);
java.lang.NumberFormatException 失败,但是
Long.parseLong(Integer.toHexString(-3), 16);
得到 4294967293,即 2^32 - 3。
TLDR,您应该避免将结果转换为整数并返回到十六进制字符串。将您的代码简化为
String value = Integer.toHexString(num1 - num2);
t_result.setText(value);
其他运算也是如此,不仅仅是减法。
- 除法的问题是结果的类型是整数。当然,整数结果不能有任何小数部分。您应该使用 double 来保存结果。 例如:
String value = Double.toHexString((double)num1 / num2);
t_result.setText(value);
这会给你小数部分。