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.9999999999999984 摄氏度

4

4 回答 4

5

因为 Java 使用浮点数的 IEEE 二进制表示,所以浮点计算几乎从不“精确”。问题是 33.8 不能准确表示,它在内部是 33.799999999999996 或其他东西。当您将其转换回摄氏温度时,您会得到一个略小于 1 的数字。

与往常一样,相关参考资料是What Every Computer Scientist Should Know About Floating-Point Arithmetic

于 2012-10-19T04:20:21.810 回答
4

@Greg 是对的

你只需要做一些四舍五入:

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

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

无论如何 - 不要担心你的值很好,但是要比较(或打印,这是当前的用例)它们,你需要一些 epsilon/precision,因为 - 再次:浮点计算几乎永远不会“精确”

于 2012-10-19T04:24:22.200 回答
2

Double.toString()使用(或其隐式等效项)时,浮点不准确性将非常明显。而是更喜欢String.format("%.3f", value)您选择的精度

旁注:在 Java 中,无论您分配的数据类型如何,将整数除以整数都会产生整数。重构代码时要小心,因为看起来相似的东西可能会无意中舍入结果中的一个因素。(有关详细信息,请阅读Java 语言规范本节的第二段。)

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

值的细微差别仅仅是浮点不准确的结果。十进制值不能表示为二进制的精确值(计算机内部使用的值),导致在 10^-16 左右的水平上存在极小的差异。本文很好地涵盖了这个主题(尽管使用 Python)。

于 2012-10-19T04:16:08.567 回答