2012-06-19 25 views
3

我有一個問題,從華氏轉換爲Java中的攝氏。我剛開始學習Java,並且仍然在通過書籍和教程進行工作。從華氏轉換爲攝氏(Java)時舍入數字?

對於我的第一個程序,我試圖創建一個基於this tutorial的基本溫度計算器。

我想擴展它的功能,並且還包括華氏轉換爲攝氏溫度,以及基礎攝氏溫度到華氏轉換。因此,我使用給出的示例代碼得到了攝氏溫度到華氏溫度的部分,現在,使用相同的代碼,經過大量試驗和錯誤稍作修改才能使其工作,我試圖解決另一半。我在一定程度上達到了它的效果,但這並不完全正確。

當我輸入,例如,89華氏度,它返回31攝氏度,而不是預期的32.我認爲這是一個問題,數字越來越四捨五入,但我不知道如何去修理它。我已經完成了一些閱讀,我認爲可以通過將RoundingMode設置爲「HALF_UP」來解決這個問題,但我不確定如何去做,以便它隻影響這種轉換,而不是另一種作品。這是我有:

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

任何幫助或建議,可以給予將不勝感激。謝謝你的時間。

回答

5

使用Math.round()執行舍入,而不是轉換爲int。總是鑄造輪朝0,如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"); 
+0

2017年6月16日你應該擊中米爾代表 – phadaphunk

+0

謝謝!這工作。 – Matt

2

tempCel應該聲明爲float,以便它可以有小數值。 然後在印刷時

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

這不會編譯 - 你試圖給'float'變量賦一個'double'值。 –

+0

@JonSkeet是的,編輯。 – kjp

1

打破你的計算,你應該四捨五入tempCel:

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

,擺脫所有這些temp前綴 - 他們沒有多大的意義。

0

使用此:

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

我知道OP是學習Java,但爲求其他人會來這裏尋找從華氏轉換到攝氏溫度,我推薦使用JScience library,它具有很多開發科學應用的功能。其中一個強大的功能也是從NonSI unitsSI units的單位轉換。

下面是用於轉換從華氏到攝氏一個簡單的例子:

保存華氏溫度值到字符串並解析它的兩倍。這兩行與@Jon Skeet的答案相同。

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

現在我們建立暖喜SI單元。 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");