3

Javaで華氏から摂氏に変換する際に問題が発生しました。私はJavaを学び始めたばかりで、まだ本やチュートリアルを進めています。

私の最初のプログラムでは、このチュートリアルに基づいて基本的な温度計算機を作成しようとしています。

機能を拡張し、華氏から摂氏への変換と、基本の摂氏から華氏への変換も含めたいと思います。

そこで、与えられたサンプルコードを使用して摂氏から華氏までの部分を機能させました。同じコードを使用して、多くの試行錯誤の末、機能させるために少し変更しました。残りの半分に取り組んでいます。 。ある程度は動作するようになりましたが、完全には正しくありません。

たとえば、華氏89度に入ると、予想される32度ではなく、摂氏31度が返されます。これは、数値の丸め方の問題だと思いますが、修正方法がわかりません。 。少し読んだことがありますが、RoundingModeを「HALF_UP」に設定することで修正できるかもしれませんが、この変換にのみ影響し、他の変換には影響しないようにする方法がわかりません。動作します。これは私が持っているものです:

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

与えられることができるどんな助けまたは提案も大いに感謝されるでしょう。御時間ありがとうございます。

4

5 に答える 5

5

Math.round()にキャストする代わりに、丸めを実行するために使用しますintJLSセクション5.1.3に従って、キャストは常に0に向かって丸められます。

それ以外の場合、浮動小数点数が無限大でない場合、浮動小数点値は整数値Vに丸められ、IEEE 754ゼロへの丸めモード(§4.2.3)を使用してゼロに向かって丸められます。

または-の範囲外である可能性があるため、Math.round(double)まだ、を返すように宣言されていることに注意してください。ただし、あなたの場合は問題にならないことを期待しています。doubleintlong

また、代わりにコードを複数のステートメントに分割することをお勧めします。

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");
于 2012-06-19T20:45:48.530 に答える
2

tempCelは、小数値を持つことができるようにfloatとして宣言する必要があります。そして、それを印刷するときにtempCelを丸める必要があります

double tempCel = (Double.parseDouble("1.45")- 32) * .55555;
System.out.println(Math.round(tempCel));
于 2012-06-19T20:43:20.497 に答える
2

OPがJavaを学習していることは知っていますが、華氏から摂氏への変換を探してここに来る他の人々のために、科学アプリケーションを開発するための多くの機能を備えたJScienceライブラリを使用することをお勧めします。その強力な機能の1つは、NonSI単位からSI単位への単位変換でもあります。

華氏から摂氏に変換する簡単な例を次に示します。

華氏の値を文字列に保存し、それを2倍に解析します。この2行は、@JonSkeetの回答と同じです。

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

次に、 NonSIおよびSI単位を構築します。JScienceには、キロメートルやセンチメートルなどの乗法単位ではなく、基本単位が含まれます。これらの単位を作成するために、SIは複合単位を作成する方法を提供します。詳細については、このリファレンスを参照してください。詳細な説明については、公式APIを読むことをお勧めします。これには、さらに多くの例があります。

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

次に、ソースユニットにデスティネーションユニットへの適切なコンバーターを要求して華氏に変換し、コンバーターを使用します。

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

正しく丸めるには、BigDecimal setScale()メソッドを使用することをお勧めします。RoundingModeの場合、通常はHALF_UP使用しますが、状況によって異なります。華氏から摂氏への変換には、HALF_UP丸めを使用することをお勧めします。小数点第1位を四捨五入するように設定します。

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

ラベルに値を設定します。

tempCelLabel.setText(celsius + "° Celsius");
于 2012-07-23T18:17:11.327 に答える
1

計算を分解します。

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

そして、それらすべてのプレフィックスを取り除きますtemp—それらはあまり意味がありません。

于 2012-06-19T20:45:45.400 に答える
0

これを使って:

long tempCel = Math.round((5.0 / 9.0) * (Double.parseDouble(tempTextFieldFC.getText()) - 32 ));
tempCelLabel.setText(tempCel + " ° Celsius"); 
于 2012-06-19T20:47:24.683 に答える