【问题标题】:Rounding numbers when converting from Fahrenheit to Celsius (Java)?从华氏温度转换为摄氏温度(Java)时舍入数字?
【发布时间】:2012-06-21 23:16:33
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: java calculator


    【解决方案1】:

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

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

    【讨论】:

    • 这不会编译 - 您正在尝试将 double 值分配给 float 变量。
    【解决方案2】:

    分解你的计算:

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

    并去掉所有那些 temp 前缀——它们没有多大意义。

    【讨论】:

      【解决方案3】:

      使用Math.round() 执行舍入,而不是强制转换为int。根据JLS section 5.1.3

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

      请注意,Math.round(double) 仍被声明为返回 double,因为它可能超出了 intlong 的范围 - 但我希望这不会成为您的问题。

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

      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");
      

      【讨论】:

      • 您应该在 2017 年 6 月 16 日之前达到百万销售量
      【解决方案4】:

      使用这个:

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

      【讨论】:

        【解决方案5】:

        我知道 OP 正在学习 Java,但是为了其他人会来这里寻找从华氏到摄氏度的转换,我建议使用具有很多开发功能的JScience library科学应用。其中一个强大的功能也是从NonSI unitsSI units 的单位转换。

        下面是一个将华氏温度转换为摄氏温度的简单示例:

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

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

        现在我们构建 NonSISI 单元。 JScience 包括基本单位,不包括 公里和厘米等乘法单位。创造 这些单元,SI 提供了构建复合单元的方法。请 请参阅this references 了解更多信息。详细解释我推荐阅读official API,里面还有更多例子。

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

        现在我们通过向源单位询问到目标单位的适当转换器并将其转换为华氏温度并使用该转换器。

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

        为了正确舍入,我建议使用BigDecimal setScale() method。现在对于RoundingMode,我通常使用HALF_UP,但这取决于具体情况。对于华氏到摄氏度的转换,我建议使用 HALF_UP 舍入。我们将设置为四舍五入到一位小数。

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

        为标签设置值。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多