2014-01-07 4 views
-1

Я делаю программу для преобразования одной температуры в другую. Например, по Фаренгейту до Цельсия, по Цельсию до Фаренгейта, по Цельсию до Кельвина и т. Д.Логическая ошибка при преобразовании температуры

У меня настроен графический интерфейс, но теперь я получаю ошибки во время преобразования. Я искал методы преобразования, но, похоже, не нашел. Поэтому я пишу их на основе формул, которые я видел в Интернете.

private static class EventHandler implements ActionListener { 
    /** 
    * this method gets called when an object we are listening to is interacted with 
    * 
    * @param evt ActionEvent that interacted with 
    */ 
    public void actionPerformed(ActionEvent evt) { 
     //creates the formating we would like for the numbers 
     DecimalFormat df = new DecimalFormat("#.##"); 
     //if the event triggered was celInput than 
     if (evt.getSource() == cText) { 
      String strcText = cText.getText(); 
      double cTemp = Double.parseDouble(strcText); 
      fText.setText("" + convertCtoF(cTemp)); 
      kText.setText("" + convertCtoK(cTemp)); 
     }else if(evt.getSource() == fText) { 
      String strfText = fText.getText(); 
      double fTemp = Double.parseDouble(strfText); 
      cText.setText("" + convertFtoC(fTemp)); 
      kText.setText("" + convertFtoK(fTemp)); 
     }else if(evt.getSource() == kText) { 
      String strkText = kText.getText(); 
      double kTemp = Double.parseDouble(strkText); 
      cText.setText("" + convertKtoC(kTemp)); 
      fText.setText("" + convertKtoF(kTemp)); 
     }  
    }//end actionPerformed method 
} 
public static double convertCtoF(double c) { 
    return (c/(5/9)) + 32; 
} 
public static double convertFtoC(double f) { 
    return (5/9) * (f - 32); 
} 
public static double convertCtoK(double c) { 
    return c + 273.15; 
} 
public static double convertFtoK(double f) { 
    return convertFtoC(f) + 273.15; 
} 
public static double convertKtoC(double k) { 
    return k - 273.15; 
} 
public static double convertKtoF(double k) { 
    return ((9/5) * convertKtoC(k)) + 32; 
} 

Это все код, который, по моему мнению, понадобится для того, чтобы найти логическую ошибку.

Любая помощь будет принята с благодарностью, так как я не понимаю, почему это происходит.

+2

Какая у вас ошибка? –

+0

Точная ошибка при компиляции. Но когда я ввожу 27 в конверсионную коробку, я получаю 270.2 (повторяю) вместо 80.6. И кельвин получает -2.7 (повторяется) вместо 300. – TaylorTDHouse

ответ

2

Это классический случай ваших подразделений (например, (5/9)), выполняемый в целочисленной арифметике (что отбросит остаток).

Перед делением необходимо продвинуть по крайней мере один из литералов до double; например

5.0/9 

Если компилятор обнаруживает int и double в операнды оператора, то int типа получает способствовало к double до вычисления.

+0

Да, это то, о чем я думал раньше, но это не полностью устранило проблему тогда или сейчас, что заставляет меня поверить, что это проблема в другом месте. – TaylorTDHouse

+0

Эта часть в конце около Стоградуса и Цельсия не совсем так. Вы неправильно поняли статью в Википедии. Термины «Столиград» и «Цельсий» являются точными синонимами - они не отличаются на 0,01. –

+1

Согласно статье, которую вы связали с :-), имя было изменено с «стоградусного» на «Цельсия», чтобы избежать путаницы со словом на разных языках для измерения угла. Значение идентично. И разница между Кельвинами и градусами Цельсия равна 273,15. Это НЕ 273.16. –

-1

Вместо (c/(5/9)) + 32, напишите c * 9/5 + 32. Поскольку c - это double, это выражение будет double, и у вас не будет проблем с целым делением.

Вместо (5/9) * (f - 32), написать (f - 32) * 5/9. Поскольку f является double, это выражение будет double на всем протяжении, и у вас не будет проблем с целым делением.

Обновление

Кроме того, вместо (9/5) * convertKtoC(k), написать convertKtoC(k) * 9/5, по той же причине.

Update снова

Вышеуказанные изменения все должно быть сделано. НО у вас тоже есть другая проблема. Я считаю, что вы просто не указали свои текстовые поля. 27 Фаренгейта - 270,2222 Кельвина, что составляет -2,7777 по Цельсию. Таким образом, вы просто поменяли три поля. Ваше поле Кельвина помечено как Фаренгейт, поле Цельсия обозначено Кельвином, а поле вашего Фаренгейта - Цельсия.

+0

ничего не менял: \ – TaylorTDHouse

0

bathsheba изменяется справа 5 до 5,0 сделает трюк. Я написал ниже код, и он работал /* пакет; // не размещайте имя пакета! */

import java.util.*; 
import java.lang.*; 
import java.io.*; 
class Ideone 
{ 
public static void main (String[] args) throws java.lang.Exception 
{ 
    // your code goes here 
    double cTemp = Double.parseDouble("27"); 
     System.out.println("" + convertCtoF(cTemp)); 
     System.out.println("" + convertCtoK(cTemp)); 
} 
public static double convertCtoF(double c) { 
    return (c/(5.0/9.0)) + 32; 
} 
public static double convertCtoK(double c) { 
return c + 273.15; 
} 
} 

Если это не решает проблему, то я уверен, что проблема не в вашей логике его некоторые где-то еще.

+0

Это только ЧАСТЬ проблемы. Другая важная часть проблемы заключается в том, что OP обменивает поля вокруг - см. Мой ответ для деталей. –

Смежные вопросы