2013-01-04 21 views
4

我的問題是有關在java中的轉換。 我有一個整數1615021049.當除以1(這也是一個浮點數)時,浮點數爲1.61502106E9,當它轉換回整數時,給出1615021056這不是原始數字。請幫助。 如果我將變量m和b轉換爲雙倍,那麼同樣可以正常工作。java中的轉換

int a=1615021023; 
float m=1; 
float b=a/m; 
int d= (int) b; 

回答

5

的問題是,float的尾數比特太少表示1615021049準確。後者需要31位,而前者只提供23位。因此會損失精度。

這不是doubles因爲double有52位尾數的,足夠的問題表示1615021049.

Wikipedia

3

有一個無限的實數。浮點數只有32位。很顯然,並非每一個真實的東西都可以準確地表現爲一個浮動。而浮動表示使得小數字比大數字更準確。

2

int有31位(加號),以存儲該值,而僅float具有24位(加上指數和符號)

這意味着一些大的值不能沒有錯誤來表示。如果你使用雙值,其值爲53位,你不會有問題。

總之,避免使用浮動除非你是一個使用它的好理由。

int i = 1615021023; 
int a = (int) (double) i; 
int b = (int) (float) i; 
System.out.println("double: " + a + ", float: " + b + ", should be " + i); 

打印

double: 1615021023, float: 1615021056, should be 1615021023 
1

在java中,

  1. 整型使用32位來表示其值。
  2. FLOAT使用一個23位的尾數,所以大於2^23的整數會有最小有效位被截斷。例如,33554435(或0x200003)將被截斷到33554432 +/- 4左右
  3. DOUBLE使用52位尾數,因此將能夠表示32位整數而不丟失數據。 您還可以在維基百科上看到「Floating Point