Неверное значение при пересчете по Цельсию / Фаренгейту - PullRequest
1 голос
/ 09 февраля 2012

Это базовое приложение для конвертации единиц.

Я только что закончил кодирование, и все отлично работает, кроме расчета по Фаренгейту и Цельсию. Формула верна, но не знаю почему.

Вот Activity.Java

package arirang.unit.converter;

import java.text.DecimalFormat;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.EditText;
import android.widget.TextView;


public class BasicUnitConverterActivity extends Activity {

    EditText val3;
    String val2;
    int val1;
    String forResult;
    Spinner Type;


    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Spinner spinner1 = (Spinner) findViewById(R.id.Spinner1);
        ArrayAdapter adapter1 = ArrayAdapter.createFromResource(
            this, R.array.UnitList, android.R.layout.simple_spinner_item);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(adapter1);
    }

    private String changeFormat(Double dbResult) {
        String result;

        DecimalFormat format = new DecimalFormat();
        result = format.format(dbResult);
        return result;
    }



    public void converter(View View) {


        EditText val3 = (EditText) findViewById(R.id.BeforeBox);
        String val2 = val3.getText().toString();
        if (val2.length() > 0) {

            val1 = Integer.parseInt(val2);
            Type = (Spinner) findViewById(R.id.Spinner1);

            double dbResult = 0;

            if (Type.getSelectedItem().toString().equals("meter to inch")) {
                dbResult = val1 * 39.3700787;
            } else if (Type.getSelectedItem().toString().equals("meter to feet")) {
                dbResult = val1 * 3.2808399;
            } else if (Type.getSelectedItem().toString().equals("feet to inch")) {
                dbResult = val1 * 12;
            } else if (Type.getSelectedItem().toString().equals("feet to meter")) {
                dbResult = val1 / 3.2808399;
            } else if (Type.getSelectedItem().toString().equals("inch to meter")) {
                dbResult = val1 / 39.3700787;
            } else if (Type.getSelectedItem().toString().equals("inch to feet")) {
                dbResult = val1 / 12;
            } else if (Type.getSelectedItem().toString().equals("kilogram to pound")) {
                dbResult = val1 * 2.20462262;
            } else if (Type.getSelectedItem().toString().equals("pound to kilogram")) {
                dbResult = val1 / 2.20462262;
            } else if (Type.getSelectedItem().toString().equals("Fahrenheit to Celsius")) {
                dbResult = (val1 - 32) * (5 / 9);
            } else if (Type.getSelectedItem().toString().equals("Celsius to Fahrenheit")) {
                dbResult = (val1 * (9 / 5)) + 32;
            }

            forResult = changeFormat(dbResult);

            TextView AfterBox = (TextView) findViewById(R.id.AfterBox);
            AfterBox.setText(forResult);
        }
    }

}

Ответы [ 2 ]

6 голосов
/ 09 февраля 2012

dbResult=(val1 - 32) * (5 / 9); должно быть dbResult=(val1 - 32) * (5f / 9); Проблема в том, что когда вы пишете 5/9, это означает, что вы делите значения типа int и, следовательно, результат будет 0 (5 меньше 9, поэтому 5/9 равно 0. Если бы это было 10/9 результат был бы 1). Добавляя приведение к float к одному из аргументов, компилятор выполняет так называемое преобразование типа приращения примитивов и продвигает оба аргумента оператора / для float. Теперь, когда деление между значениями с плавающей запятой выполнено, вы получите ожидаемый результат.

1 голос
/ 09 февраля 2012

Я бы определенно сделал «val1» поплавком и выполнял бы всю мою математику в «двойном» пространстве.По завершении обрежьте или округлите до целого числа, а не во время вычисления.

  double val1;
  ...
  dbResult = (val1 * (9.0 / 5.0)) + 32.0;
  ...

ИМХО ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...