3 votes

Arrondir les chiffres lors de la conversion de Fahrenheit en Celsius (Java) ?

Je n'arrive pas à convertir les degrés Fahrenheit en degrés Celsius en Java. Je viens de commencer à apprendre Java et je suis encore en train de parcourir les livres et les tutoriels.

Pour mon premier programme, j'essaie de créer un calculateur de température de base basé sur les éléments suivants ce tutoriel .

Je souhaite étendre ses fonctionnalités et inclure une conversion de Fahrenheit en Celsius, en plus de la conversion de base de Celsius en Fahrenheit.

J'ai donc réussi à passer de Celsius à Fahrenheit en utilisant l'exemple de code qui m'a été donné, et maintenant, en utilisant le même code, légèrement modifié après beaucoup d'essais et d'erreurs pour le faire fonctionner, j'essaie de m'attaquer à l'autre moitié. J'ai réussi à le faire fonctionner dans une certaine mesure, mais ce n'est pas tout à fait correct.

Lorsque j'entre, par exemple, 89 degrés Fahrenheit, il renvoie 31 Celsius au lieu des 32 attendus. Je pense qu'il s'agit d'un problème dans la façon dont le nombre est arrondi, mais je ne suis pas sûr de savoir comment le résoudre. J'ai lu quelques articles et je pense que le problème pourrait être résolu en réglant le RoundingMode sur "HALF_UP", mais je ne sais pas comment faire pour que cela n'affecte que cette conversion, et pas l'autre qui fonctionne. Voici ce que j'ai :

int tempCel = (int) ((int)((Double.parseDouble(tempTextFieldFC.getText())) 
         - 32) * .55555);
tempCelLabel.setText(tempCel + " ° Celsius"); 

Toute aide ou suggestion sera grandement appréciée. Merci pour votre temps.

5voto

Jon Skeet Points 692016

Utilice Math.round() pour effectuer l'arrondi, au lieu d'effectuer un casting vers int . Le moulage est toujours arrondi à 0, conformément à la règle suivante JLS section 5.1.3 :

Sinon, si le nombre à virgule flottante n'est pas un infini, la valeur à virgule flottante est arrondie à une valeur entière V, en arrondissant vers zéro en utilisant le mode d'arrondi vers zéro de l'IEEE 754 (§4.2.3).

Il convient de noter que Math.round(double) est toujours déclaré comme renvoyant un double car elle peut se situer en dehors du champ d'application de la int o long - mais je pense que cela ne devrait pas poser de problème dans votre cas.

Je vous conseille également de diviser votre code en plusieurs déclarations :

String fahrenheitText = tempTextFieldFC.getText();
double fahrenheit = Double.parseDouble(fahrenheitText);
double celsius = ((fahrenheit - 32) * 5) / 9;
int celsiusRounded = (int) Math.round(celsius);
tempCelLabel.setText(celsiusRounded + "° Celsius");

2voto

kjp Points 1596

TempCel devrait être déclaré float pour pouvoir avoir des valeurs fractionnaires. Ensuite, il faut arrondir tempCel lors de l'impression

double tempCel = (Double.parseDouble("1.45")- 32) * .55555;
System.out.println(Math.round(tempCel));

2voto

Jernej Jerin Points 806

Je sais que l'OP est en train d'apprendre Java, mais pour le bien des autres personnes qui viendront ici recherche de la conversion de Fahrenheit en Celsius Je recommande d'utiliser Bibliothèque JScience qui offre de nombreuses fonctionnalités pour le développement d'applications scientifiques. L'une de ces fonctions puissantes est la conversion d'unité de Unités non-SI a Unités SI .

Voici un exemple rapide de conversion de Fahrenheit en Celsius :

Enregistrement de la valeur Fahrenheit dans une chaîne de caractères et analyse de cette valeur en double. Ces deux lignes sont les mêmes que dans la réponse de @Jon Skeet.

String fahrenheitText = tempTextFieldFC.getText();
double fahrenheit = Double.parseDouble(fahrenheitText);

Nous construisons maintenant NonSI y SI unité. JScience comprend les unités de base, et non les unités les unités multiplicatives comme le kilomètre et le centimètre. Pour créer des ces unités, le SI fournit des méthodes pour construire des unités composites. Voir voir ces références pour plus d'informations. Pour des explications plus détaillées, je recommande de lire API officielle qui contient également d'autres exemples.

Unit<Temperature> FAHRENHEIT = NonSI.FAHRENHEIT;
Unit<Temperature> CELSIUS = SI.CELSIUS;

Nous la convertissons maintenant en degrés Fahrenheit en demandant à l'unité source un convertisseur approprié vers l'unité de destination et en utilisant le convertisseur.

BigDecimal celsius = BigDecimal.valueOf(FAHRENHEIT.getConverterTo(CELSIUS).convert(fahrenheit));

Pour un arrondi correct, je recommande d'utiliser Méthode BigDecimal setScale() . Maintenant, pour Mode d'arrondi J'utilise généralement HALF_UP mais cela dépend de la situation. Pour la conversion de Fahrenheit en Celsius, je recommande d'utiliser HALF_UP l'arrondi. Nous allons choisir d'arrondir à un chiffre après la virgule.

celsius = celsius.setScale(1, RoundingMode.HALF_UP);

Valeur de réglage de l'étiquette.

tempCelLabel.setText(celsius + "° Celsius");

1voto

musiphil Points 916

Décomposez votre calcul :

double fahrenheit = Double.parseDouble(tempTextFieldFC.getText());
double celcius = (fahrenheit - 32) * 5 / 9;
tempCelLabel.setText(Math.round(celcius) + " ° Celsius");

et se débarrasser de tous ces temp les préfixes - ils ne signifient pas grand-chose.

0voto

Elias Points 2409

Utilisez ceci :

long tempCel = Math.round((5.0 / 9.0) * (Double.parseDouble(tempTextFieldFC.getText()) - 32 ));
tempCelLabel.setText(tempCel + " ° Celsius");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X