天天看點

數值類型的轉換與強制轉換-Java

目錄

  • ​​一、數值類型之間的轉換​​
  • ​​二、強制類型轉換​​
  • ​​2.1文法格式​​
  • ​​2.2Math.Round()​​

一、數值類型之間的轉換

char

int

byte

short

long

float

double

6個實心箭頭箭頭表示無資訊丢失的轉換;

3個虛箭頭表示可能有精度損失的轉換.

當使用上面兩個數值進行二進制操作時,先要将兩個操作數轉換為同一類型,然後再進行計算.

規則:`兩個數中小類型的值将自動轉換為大類型的值.

小轉大可以,但是大轉小會損失精度,則需要強制轉換.

  • 注意
  • 算數表達式包含不同的基本資料類型的值的時候,整個算術表達式的類型會自動提升.
  • 提升規則
  • 算數表達式中,byte,short,char類型的運算都會被提升到int類型,不管是否有其他類型參與運算.
  • 整個算術表達式的類型自動提升到與表達式中最高等級的變量相同的類型
  • 指派運算符
  • 在使用指派運算符的時候會自動進行強制類型轉換

二、強制類型轉換

2.1文法格式

在圓括号中給出想要轉換的目标類型,後面緊跟待轉換的變量名.

例:

double m = 9.99;

int n = (int)m;

其中n的值為9.

強制類型轉換通過截斷小數部分将浮點值轉換為整形.

2.2Math.Round()

傳回最接近參數的 int。結果将舍入為整數:加上 1/2,對結果調用 floor 并将所得結果強制轉換為 int 類型。換句話說,結果等于以下表達式的值:

(int)Math.floor(a + 0.5f)

特殊情況如下:

如果參數為 NaN,那麼結果為 0。

如果結果為負無窮大或任何小于等于 Integer.MIN_VALUE 的值,那麼結果等于 Integer.MIN_VALUE 的值。

如果參數為正無窮大或任何大于等于 Integer.MAX_VALUE 的值,那麼結果等于 Integer.MAX_VALUE 的值。

public static int round(float a) :

​​

​若傳入Round方法的值為float,傳回值為int,可直接用int類型的值接收即可.​

​​ public static long round(double a) :

​但傳入Round方法的值為double時,傳回值為long,則需要手動強轉為int類型.​

代碼示例:

public class MathRoundDemo {
  public static void main(String[] args) {
    double a = 1.847;
    System.out.println(Math.round(a));
    
    float b = 1.847f;
    System.out.println(Math.round(b));
    
    int c = (int)Math.round(a);
    System.out.println(c);
    
    System.out.println(Math.round(a*100)/100.0);
    System.out.printf("%.2f",a);
  }
}
/*輸出:
2
2
2
1.85
1.85
*/      

代碼分析:

  1. ​float b = 1.847f;​

    ​若不添加字尾f,則需要将1.847進行強轉,預設小數位double類型.賦給float(大轉小會損失精度,則需要強制轉換).
  2. ​int c = (int)Math.round(a);​

    ​傳入的參數為double類型,傳回類型為long,同理,大轉小,需要強制轉換.
  3. 對于想要進行小數位數的保留方法,此代碼中想要1.847保留小數點後兩位:

    ​​

    ​System.out.println(Math.round(a*100)/100.0);​

    ​​ 原理:小數點先右移兩位後應用Math.round方法進行四舍五入後,在将小數點向左移兩位.

    ​​

    ​System.out.printf("%.2f",a);​

    ​ 原理:應用了格式化輸出,推薦使用這種方式簡單高效穩定.具體介紹請看:Java中格式化輸出