2013-01-04 22 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