2011-08-15 174 views
6

我必須編寫程序,從用戶那裏得到一個數字n,然後計算總和:s = 1/1 + 1/2 + ... + 1/n。自動鑄造

我寫了這個代碼:

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Scanner unos = new Scanner(System.in); 
     System.out.println("n=?"); 
     int n = unos.nextInt(); 

     double s = 0.0; 
     for (int i = 1; i <= n; i++) { 
      s = s + (1.0/i); 
     } 
     System.out.println("s=" + s); 
    } 
} 

如何Java的決定的int值i轉換爲雙在此聲明:

s = s + (1.0/i); 
+0

'S = S +(1.0D /(雙)ⅰ); '? –

+0

@精英紳士,我上面的代碼作品,我只問什麼是轉換規則。 –

回答

8

支配的規則是什麼類型被轉換/提升爲Java語言規範Chapter 5 - Conversions and Promotions中定義的其他類型。

對於大多數算術運算,請參見Binary Numeric Promotion部分。

當運算符向一對操作數應用二進制數字提升時,每個操作數都必須表示一個數值類型的值,下面的規則按順序應用,使用加寬轉換(§5.1.2)進行轉換操作數如有必要:

  • 如果任一操作數的類型爲double,則另一個操作數轉換爲double。
  • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。

在你的情況,1.0是雙,所以i被轉換爲雙(擴大轉換)。由於s已經是雙倍數,因此不需要進一步轉換。

1

它只是促進i到最接近double值使得前師。

有關詳細信息,請參閱The Java Language Specification section 5.1.2 Widening Primitive Conversion

一個平局決勝規則,甚至更少偏見是圓的一半,甚至, 即

如果分數的y是0.5,那麼q是y的最接近 的偶數。

因此,例如,+23.5變爲+24,+22.5變爲+22,-22.5, 變爲-22,並且-23.5變成-24。

這種方法也把正 和負值對稱,因此是遊離整體 偏壓如果原始數也是正的或負的以相等的概率 。此外,即使後者全部爲正數(或全部爲負數),對於數值的最合理分佈,四捨五入數字的預期(平均)值與原始數字的數值基本相同,即 。然而,這條規則將對偶數(包括零)仍然引入正偏差,而對於奇數則爲負偏差。

圓入到最接近的 方法也被稱爲無偏舍入(含糊,和位 濫用),收斂舍入,統計學家的舍入,荷蘭語 舍入,高斯取整,或銀行家舍入的這種變型。這在簿記中廣泛使用 。

這是用於IEEE 754 計算功能和運算符的默認舍入模式。

來源:Wikipedia

+0

OP不問*正在做什麼,他問*如何*。它如何選擇將int值轉換爲double? – amit

5

如果類型之間不存在匹配(和分割雙用一個int是不是一個匹配)其選擇下列之一,(1)的最高優先級:

(1) identity conversion 
(2) a widening primitive conversion 
(3) a widening reference conversion 
(4) a boxing conversion optionally followed by a widening reference conversion 
(5) an unboxing conversion optionally followed by a widening primitive conversion. 

在這種情況下,它選擇(2),拓寬原語。它沒有雙更改爲int,因爲雙> int是沒有身份,也沒有擴大,因此剩下的唯一選擇是擴大的int雙

更多信息:http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#184206

3

在對不同類型的數據進行算術時,Java往往會擴大涉及的類型,以免丟失信息。

如果其中一個變量是double,那麼java會將這兩個變量視爲double。

退房this後清除所有的疑慮:

1

看到,當我們將執行一些操作,其中涉及到不同類型的數據類型,然後較小的類型值將始終被轉換爲更高類型的值,使得沒有值將丟失在結果和價值觀將相互兼容。

+0

我怎麼知道哪個數據類型較小,哪個數據類型較高? –

+0

當你開始閱讀任何語言。知道所有數據類型的大小是基本的。至少是大多數使用的數據類型。因此,其大小更大,否則更小。 –

0

規則非常簡單

  1. 它首先如果任一操作數爲雙,如果這是真的 然後將其轉換爲非雙操作數。如果第一個說法是假的,然後它的兩倍範圍
  2. 檢查 操作數中的任何一個是否爲浮點型,如果爲真,則它將非浮點型操作數轉換爲浮點型操作數。
  3. 如果沒有上面那麼Java的保持類型,因爲它是

見下面的代碼更清楚地理解

public static void main(String[] args) { 
    int int_val = 20; 
    double doub_val = 20.0; 
    float flo_val = 20.0f; 

    /* lets see the first statement of my answer is true */ 
    //## 1.0 I'm dividing double/float 
    System.out.println(((Object)(doub_val/flo_val)).getClass().getName()); 
    //## 1.1 I'm dividing double/int 
    System.out.println(((Object)(doub_val/int_val)).getClass().getName()); 

    //## 2.0 I'm dividing float/int 
    System.out.println(((Object)(flo_val/10)).getClass().getName()); 

    //## 3.0 I'm dividing int/int 
    System.out.println(((Object)(int_val/10)).getClass().getName()); 
    //## 3.1 I'm dividing double/double 
    System.out.println(((Object)(doub_val/10.0)).getClass().getName()); 
    //## 3.2 I'm dividing float/float 
    System.out.println(((Object)(flo_val/10.0f)).getClass().getName()); 

}