1

私は多くのことを行うプログラムを書いていますが、そのうちの1つは摂氏を華氏に変換することです。これを行った後、私は逆を許可することにしました、それで私はそれをしました。摂氏を華氏に変換すると正解が得られますが、何らかの理由で華氏を華氏に変換すると答えが少しずれます。これが私のコードです:

String celcius = jTextArea3.getText();
String fahren = jTextArea7.getText();
if (fahren.equals("")) {
    double tempFahr;
    double Input = Double.parseDouble(jTextArea3.getText());

     tempFahr = Input * 9 / 5 + 32;
        jTextArea7.setText(tempFahr + "");
}
else
{
    double tempCelc;
    double Input = Double.parseDouble(jTextArea7.getText());

     tempCelc = (Input -32) * 5 / 9;
        jTextArea3.setText(tempCelc + "");
}

単純なコードですが、私が見ていない非常に小さなものである可能性があるのではないかと思います。それは私が思う私の公式かもしれませんが、そうではないと確信しています。私はそれを調べました。誰か助けてもらえますか?

私が得たオフアンサーの例は次のとおりです。1摂氏=33.8華氏33.8華氏=0.999999999999984摂氏

4

4 に答える 4

5

Javaは浮動小数点数のIEEEバイナリ表現を使用するため、浮動小数点の計算が「正確」になることはほとんどありません。問題は、33.8を正確に表すことができないことです。これは、内部的には33.799999999999996か何かです。これを摂氏に戻すと、1よりわずかに少ない数になります。

いつものように、これに関連するリファレンスは、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことです。

于 2012-10-19T04:20:21.810 に答える
4

@グレッグは正しい

丸めを行う必要があります。

final int precision = 6 // try some different values here, from 2 to... 8?

jTextArea3.setText(String.format("%." + precision + "f", tempCelc));

とにかく、値が問題ないことを心配する必要はありませんが、値を比較(または現在のユースケースである印刷)するには、イプシロン/精度が必要です。これも、浮動小数点の計算が「正確」になることはほとんどないためです。

于 2012-10-19T04:24:22.200 に答える
2

浮動小数点の不正確さは、Double.toString()(またはその暗黙の同等物)を使用すると非常に明白になります。代わりにString.format("%.3f", value)、または選択した精度を優先します

補足:Javaでは、割り当てるデータ型に関係なく、整数を整数で除算すると整数になります。コードをリファクタリングするときは注意してください。似ているように見えるものが、意図せずに結果の要素を丸める可能性があるためです。(詳細については、Java言語仕様のこのセクションの2番目の段落をお読みください。)

double test = 3 / 2;   // yields 2
double test = 3 / 2.0; // yields 1.5
于 2012-10-19T04:15:58.377 に答える
1

値のわずかな違いは、単に浮動小数点の不正確さの結果です。10進数の値は、2進数(コンピューターが内部で使用するもの)の正確な値に表すことができないため、10^-16程度のレベルで非常に小さな違いが生じます。このトピックは、この記事で非常にうまくカバーされています(ただし、Pythonを使用しています) 。

于 2012-10-19T04:16:08.567 に答える