Преобразование Фаренгейта в Цельсий дает только 0,0 и -0,0 - PullRequest
4 голосов
/ 07 сентября 2011

Я в восьмой главе (Методы, конструкторы и поля) моей книги по методам Java, и у меня возникла проблема с одним из моих упражнений.

Предоставляемый код: Temperature.java

  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import java.text.DecimalFormat;

  public class Temperature extends JApplet
   implements ActionListener {
      private JTextField displayF, displayC;
      private static DecimalFormat displayFormat = new DecimalFormat("0.0");

      public void init() {
          Container c = getContentPane();
          c.setBackground(Color.white);
          c.setLayout(new GridLayout(2, 2, 10, 0));

          c.add(new JLabel("  Fahrenheit:"));
          c.add(new JLabel("  Celsius:"));

          displayF = new JTextField(6);
          displayF.setBackground(Color.yellow);
          displayF.addActionListener(this);
          c.add(displayF);

          displayC = new JTextField(6);
          displayC.setBackground(Color.yellow);
          displayC.addActionListener(this);
          c.add(displayC);
      }

      public void actionPerformed(ActionEvent e) {
          String s;
          double degrees;
          FCConverter fc = new FCConverter();

          if ((JTextField) e.getSource() == displayF) {
              s = displayF.getText().trim();
              degrees = Double.parseDouble(s);
              fc.setFahrenheit(degrees);
              degrees = fc.getCelsius();
              displayC.setText(displayFormat.format(degrees));
          } else {
              s = displayC.getText().trim();
              degrees = Double.parseDouble(s);
              fc.setCelsius(degrees);
              degrees = fc.getFahrenheit();
              displayF.setText(displayFormat.format(degrees));
          }
      }
  }

И оттуда я должен написать и протестировать FCConverter.java Я придумал:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;

public class FCConverter
{
  private double Celsius;
  private double Fahrenheit;
  public double setFahrenheit (double degrees)
  {
      Celsius = (degrees - 32) * (5 / 9);
      return 0;
  }
  public double getCelsius ()
  {
      return Celsius;
  }
  public double setCelsius (double degrees)
  {
  Fahrenheit = (degrees * 9 / 5 + 32);
          return 0;
  }
  public double getFahrenheit ()
  {
      return Fahrenheit;
  }
}

Это, наверное, ужасно с точки зрения стиля, но я просто хотел получить какой-то рабочий код, который прошел мимо компилятора (отсюда "return 0;", который, я уверен, можно обойти гораздо более модным способом) .

Что я хочу знать, так это то, что когда я тестирую это в appletviewer или в форме браузера, преобразование Цельсия в Фаренгейт работает отлично, но преобразование Фаренгейта в Цельсий дает только 0,0 и -0,0. Я не понимаю, что не так, потому что часть, которую я разработал, кажется довольно симметричной. Не должно ли быть так, что оба или ни один метод преобразования не работает?

Ответы [ 5 ]

3 голосов
/ 07 сентября 2011

Проблема, кажется, 5/9. Они рассматриваются как целое число, а 5/9 - это 0, а 0 - целое число. Так что * 0 = + -0:)

Поставьте «d» после чисел, (5d / 9d), заставляя компилятор считать их двойными.

3 голосов
/ 07 сентября 2011

В целых числах (5/9) = 0.

и (градусы - 32) * (5/9); всегда будет 0, вам нужно использовать удваивается или что-то.

0 голосов
/ 18 декабря 2018
import java.util.Scanner;
public class HelloWorld {

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);  // Reading from System.in

        System.out.println("Enter  the number of Fahrenheit temperatures to convert to Kelvins");
// opts for the user to enter a number 

        int F = reader.nextInt() ; // Scans the next token of the input
        double f = 5/9d;
        System.out.println(f);
        double x = F -32;
        System.out.println(x);
        double K = (f*x)+ 273.0; // the formulae to calculate temperature  in Kelvin
        System.out.println( +F + " Fahrenheit is equal " +K + " Kelvins" ) ;
        reader.close();




    }       

}
0 голосов
/ 07 сентября 2011

измените (5 / 9) на (5.0 / 9.0), чтобы сообщить Java, что вы хотите разделить действительные числа.

0 голосов
/ 07 сентября 2011

Если вы ничего не возвращаете, установите тип возврата void.Если вам нравится возвращать double, вы должны использовать double в расчетах.5/9 всегда ноль, потому что 5 и 9 - целые числа.5.0 / 9.0 - это другое вычисление для двойников.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;

public class FCConverter
{
  private double Celsius;
  private double Fahrenheit;
  public void setFahrenheit (double degrees)
  {
     Celsius = (degrees - 32.0) * (5.0 / 9.0);
  }
  public double getCelsius ()
  {
      return Celsius;
  }
  public void setCelsius (double degrees)
  {
      Fahrenheit = (degrees * 9.0 / 5.0 + 32.0);
  }
  public double getFahrenheit ()
  {
      return Fahrenheit;
  }
}
...