Java中比double更大的数据类型是什么?

时间:2015-07-07 16:45:49

标签: java android double range calculator

我正在开发一个Android应用程序,一个计算器。 我用double来保存操作数。 当计算器计算更大的数字时,它没有正确显示答案。 例如,如果我输入1234567890 * 1,它会显示结果1234567936。 我认为这是由于双倍的范围问题。 怎么解决?救命啊!

这是包含运算符功能的实际代码的一部分:

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 = '\0';
                    display2.setText("=");
                } catch (Exception e) {
                    display.setText(" ");
                }

            }
        });
    } finally {
    }

}

2 个答案:

答案 0 :(得分:4)

如果您真的需要大数字,可以使用BigIntegerBigDecimal。但是,你在你的例子中给出的那个应该适合于一个卑微的int,所以你的代码可能有问题。

答案 1 :(得分:0)

http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

BigInteger是此问题的解决方案。而且没有理论上的限制。