Как заставить функцию Tan показывать неопределенное?

Я работаю над приложением Android Calculator, которое может вычислять тригонометрические функции. Я обнаружил, что мой калькулятор показывает:

Tan 90° = 1.633123935319537E16 instead of Tan 90° = undefined
Tan 270° = 5.443746451065124E15 instead of Tan 270° = undefined

Я знаю, что эти значения на самом деле означают undefined но эти расчеты могут немного запутать пользователей. Я использую Eclipse, чтобы сделать это приложение.

У меня вопрос "Как мне заставить мой калькулятор показывать сообщение?" undefined для Tan 90°, 270° и других значений, где Tan - бесконечность?".

Это мой код для функции Tan:

ImageButton btnTan;
TextView txtDisplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnTan = (ImageButton) findViewById(R.id.btnTan);
    txtDisplay = (TextView) findViewById(R.id.txtDisplay);

    btnTan.setOnClickListener(this);

}

Double total = 0.0;

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

if (v.getId() == R.id.btnTan) {
    if (txtDisplay.getText().equals("")) {
        txtDisplay.setText("");
    }
    else {
        double total = 0.0;
        total = Math.round(Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString()))));
        txtDisplay.setText("");
        txtDisplay.setText(txtDisplay.getText().toString() + total);
    }
}

3 ответа

Решение

Просто проверьте, равно ли значение градуса 270, 90 или любому другому значению, где тангенс равен NaN

TextView txtDisplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtDisplay = (TextView) findViewById(R.id.txtDisplay);
    findViewById(R.id.btnTan).setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.btnTan) {
        double value = Double.parseDouble(txtDisplay.getText().toString());
        if (value % 180 != 0 && value % 90 == 0) 
            txtDisplay.setText("undefined");
        else {
            value = Math.round(Math.tan(Math.toRadians(value)));
            txtDisplay.setText(String.valueOf(value));
        }
    }
}

Большое спасибо.

Изменение кода путем изменения

if (txtDisplay.getText().equals("")) {
    txtDisplay.setText("");
}
else {
    double total = 0.0;
    total = Math.round(Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString()))));
    txtDisplay.setText("");
    txtDisplay.setText(txtDisplay.getText().toString() + total);
}

в

double value = Double.parseDouble(txtDisplay.getText().toString());
if (value % 180 != 0 && value % 90 == 0) {
    txtDisplay.setText("undefined");
}
else if (value % 45 == 0) {
    double total = 0.0;
    total = Math.round(Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString()))));
    txtDisplay.setText("");
    txtDisplay.setText(txtDisplay.getText().toString() + total);
}
else {
    total = Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString())));
    txtDisplay.setText("");
    txtDisplay.setText(txtDisplay.getText().toString() + total);
}

решил мою проблему.

Итак, мой новый кодекс:

    ImageButton btnTan;
    TextView txtDisplay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnTan = (ImageButton) findViewById(R.id.btnTan);
        txtDisplay = (TextView) findViewById(R.id.txtDisplay);

        btnTan.setOnClickListener(this);

    }

    Double total = 0.0;

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        if (v.getId() == R.id.btnTan) {
            double value = Double.parseDouble(txtDisplay.getText().toString());
            if (value % 180 != 0 && value % 90 == 0) {
                txtDisplay.setText("undefined");
            }
            else if (value % 45 == 0) {
                double total = 0.0;
                total = Math.round(Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString()))));
                txtDisplay.setText("");
                txtDisplay.setText(txtDisplay.getText().toString() + total);
            }
            else {
                total = Math.tan(Math.toRadians(Double.parseDouble(txtDisplay.getText().toString())));
                txtDisplay.setText("");
                txtDisplay.setText(txtDisplay.getText().toString() + total);
            }
        }

Просто проверьте, составляет ли значение 90° или 270°:

double value = Math.toRadians(Double.parseDouble(txtDisplay.getText().toString()));
if (value == Math.abs(90) || value == Math.abs(270)) {
   txtDisplay.setText("undefined");
} else {
   total = Math.round(Math.tan(value));
   txtDisplay.setText(txtDisplay.getText().toString() + total);
}
Другие вопросы по тегам