3

我在 Java 中从华氏温度转换为摄氏温度时遇到问题。我刚刚开始学习 Java,并且仍在通过书籍和教程来学习。

对于我的第一个程序,我正在尝试根据本教程创建一个基本的温度计算器。

我想扩展它的功能,还包括华氏到摄氏的转换,以及基本的摄氏到华氏的转换。

所以,我使用给出的示例代码让摄氏到华氏部分工作,现在,使用相同的代码,经过大量试验和错误后稍微修改以使其工作,我正在尝试解决另一半. 我让它在某种程度上起作用,但这并不完全正确。

例如,当我输入 89 华氏度时,它返回 31 摄氏度而不是预期的 32 摄氏度。我认为这是数字四舍五入方式的问题,但我不知道如何解决它. 我已经阅读了一些内容,我认为可以通过将 RoundingMode 设置为“HALF_UP”来修复它,但我不确定如何做到这一点,以便它只影响这个转换,而不影响另一个作品。这就是我所拥有的:

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

任何可以提供的帮助或建议将不胜感激。谢谢你的时间。

4

5 回答 5

5

用于Math.round()执行舍入,而不是强制转换为int. 根据JLS 第 5.1.3 节,投射总是向 0 舍入:

否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 节)向零舍入。

请注意,Math.round(double)它仍被声明为返回 a double,因为它可能在 or 的范围之外int-long但我希望这在您的情况下不会成为问题。

我还建议您将代码拆分为多个语句:

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

我知道 OP 正在学习 Java,但是为了其他人会来这里寻找从 Fahrenheit 到 Celsius 的转换,我建议使用具有许多开发科学应用程序功能的JScience 库。其中一个强大的功能也是从非SI单位SI 单位的单位转换。

这是从华氏温度转换为摄氏温度的简单示例:

将华氏值保存为 String 并将其解析为 double。这两行与@Jon Skeet 答案中的相同。

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

现在我们建立NonSISI单位。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舍入。我们将设置为四舍五入到一位小数。

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

将值设置为标签。

tempCelLabel.setText(celsius + "° Celsius");
于 2012-07-23T18:17:11.327 回答
2

tempCel 应声明为浮点数,以便它可以具有小数值。然后你应该在打印时四舍五入 tempCel

double tempCel = (Double.parseDouble("1.45")- 32) * .55555;
System.out.println(Math.round(tempCel));
于 2012-06-19T20:43:20.497 回答
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 回答