Java 中比 double 更大的数据类型是什么?
What is the bigger datatype than double in Java?
我正在开发一个 android 应用程序,一个计算器。
我用 double 来保存操作数。
当计算器计算出更大的数字时,它没有正确显示答案。
例如,如果我输入 1234567890 * 1,它会显示结果 1234567936。
我认为这是由于double的范围问题。
如何解决?求助!
这是包含运算符功能的实际代码的一部分:
bAdd.setOnClickListener(new View.OnClickListener() { // Add Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 += Float.valueOf(display.getText().toString());
check = 'a';
display.setText(" ");
display2.setText("+");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'a';
Switch = true;
display.setText(" ");
display2.setText("+");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bSub.setOnClickListener(new View.OnClickListener() { // Subtract
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 -= Float.valueOf(display.getText().toString());
check = 's';
display.setText(" ");
display2.setText("-");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 's';
Switch = true;
display.setText(" ");
display2.setText("-");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bMul.setOnClickListener(new View.OnClickListener() { // Multiply
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 *= Float.valueOf(display.getText().toString());
check = 'm';
display.setText(" ");
display2.setText("x");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'm';
Switch = true;
display.setText(" ");
display2.setText("x");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bDiv.setOnClickListener(new View.OnClickListener() { // Divide
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 /= Float.valueOf(display.getText().toString());
check = 'd';
display.setText(" ");
display2.setText("/");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'd';
Switch = true;
display.setText(" ");
display2.setText("/");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
这是实际代码的一部分,包含等于函数:
bEq.setOnClickListener(new View.OnClickListener() { // Equals To
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (display.getText().toString() != " ") {
double result;
int temp = 0;
op2 = Float.valueOf(display.getText().toString());
op1 = Math.floor(op1 * 100) / 100;
op2 = Math.floor(op2 * 100) / 100;
if (check == 'a') {
result = op1 + op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 's') {
result = op1 - op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 'm') {
result = op1 * op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 'd') {
if (op2 != 0) {
result = op1 / op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else {
display.setText(" ");
display2.setText("Invalid");
}
} else if (check == 'p') {
try {
if (op2 == 0) {
throw new Exception();
} else {
result = (op1 / op2) * 100;
temp = (int) result;
if (result - temp == 0) {
display.setText(String
.valueOf(temp) + "%");
} else {
display.setText(String
.valueOf(result) + "%");
}
}
} catch (Exception e) {
display.setText(" ");
display2.setText("Invalid");
}
}
} else {
display.setText(" ");
}
Switch = false;
check = '[=12=]';
display2.setText("=");
} catch (Exception e) {
display.setText(" ");
}
}
});
} finally {
}
}
如果你真的需要大数字,你可以使用 BigInteger
or BigDecimal
。不过,您在示例中给出的代码甚至应该适合一个不起眼的 int
,因此您的代码可能有问题。
http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
BigInteger
是这个问题的解决方案。并且没有理论上的限制。
我正在开发一个 android 应用程序,一个计算器。 我用 double 来保存操作数。 当计算器计算出更大的数字时,它没有正确显示答案。 例如,如果我输入 1234567890 * 1,它会显示结果 1234567936。 我认为这是由于double的范围问题。 如何解决?求助!
这是包含运算符功能的实际代码的一部分:
bAdd.setOnClickListener(new View.OnClickListener() { // Add Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 += Float.valueOf(display.getText().toString());
check = 'a';
display.setText(" ");
display2.setText("+");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'a';
Switch = true;
display.setText(" ");
display2.setText("+");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bSub.setOnClickListener(new View.OnClickListener() { // Subtract
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 -= Float.valueOf(display.getText().toString());
check = 's';
display.setText(" ");
display2.setText("-");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 's';
Switch = true;
display.setText(" ");
display2.setText("-");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bMul.setOnClickListener(new View.OnClickListener() { // Multiply
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 *= Float.valueOf(display.getText().toString());
check = 'm';
display.setText(" ");
display2.setText("x");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'm';
Switch = true;
display.setText(" ");
display2.setText("x");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
bDiv.setOnClickListener(new View.OnClickListener() { // Divide
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (Switch == true) {
display.setText(display.getText() + "");
op1 /= Float.valueOf(display.getText().toString());
check = 'd';
display.setText(" ");
display2.setText("/");
} else if (display.getText().toString() != " "
&& Switch == false) {
display.setText(display.getText() + "");
op1 = Float.valueOf(display.getText().toString());
check = 'd';
Switch = true;
display.setText(" ");
display2.setText("/");
} else {
throw new Exception();
}
} catch (Exception e) {
display.setText(" ");
}
}
});
这是实际代码的一部分,包含等于函数:
bEq.setOnClickListener(new View.OnClickListener() { // Equals To
// Button
// Listener
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if (display.getText().toString() != " ") {
double result;
int temp = 0;
op2 = Float.valueOf(display.getText().toString());
op1 = Math.floor(op1 * 100) / 100;
op2 = Math.floor(op2 * 100) / 100;
if (check == 'a') {
result = op1 + op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 's') {
result = op1 - op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 'm') {
result = op1 * op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else if (check == 'd') {
if (op2 != 0) {
result = op1 / op2;
temp = (int) result;
if (result - temp == 0) {
display.setText(String.valueOf(temp));
} else {
display.setText(String.valueOf(result));
}
} else {
display.setText(" ");
display2.setText("Invalid");
}
} else if (check == 'p') {
try {
if (op2 == 0) {
throw new Exception();
} else {
result = (op1 / op2) * 100;
temp = (int) result;
if (result - temp == 0) {
display.setText(String
.valueOf(temp) + "%");
} else {
display.setText(String
.valueOf(result) + "%");
}
}
} catch (Exception e) {
display.setText(" ");
display2.setText("Invalid");
}
}
} else {
display.setText(" ");
}
Switch = false;
check = '[=12=]';
display2.setText("=");
} catch (Exception e) {
display.setText(" ");
}
}
});
} finally {
}
}
如果你真的需要大数字,你可以使用 BigInteger
or BigDecimal
。不过,您在示例中给出的代码甚至应该适合一个不起眼的 int
,因此您的代码可能有问题。
http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
BigInteger
是这个问题的解决方案。并且没有理论上的限制。