我的问题与java中的转换有关。我有一个整数 1615021049。当它除以 1(这也是一个浮点数)时,我得到的浮点数的答案是 1.61502106E9,当转换回整数时,我得到了 1615021056,这不是原始数字。请帮忙。如果我将变量 m 和 b 转换为双精度,同样可以正常工作。
int a=1615021023;
float m=1;
float b=a/m;
int d= (int) b;
我的问题与java中的转换有关。我有一个整数 1615021049。当它除以 1(这也是一个浮点数)时,我得到的浮点数的答案是 1.61502106E9,当转换回整数时,我得到了 1615021056,这不是原始数字。请帮忙。如果我将变量 m 和 b 转换为双精度,同样可以正常工作。
int a=1615021023;
float m=1;
float b=a/m;
int d= (int) b;
问题是float
' 的尾数位太少,无法准确表示 1615021049。后者需要 31 位,而前者只提供 23 位。因此会损失精度。
这不是问题,doubles
因为 adouble
有 52 位尾数,足以表示 1615021049。
参见维基百科。
有无穷多个实数。浮点数只有 32 位。很明显,并不是每个实数都可以准确地表示为浮点数。浮点表示使小数字比大数字更准确。
int
有 31 位(加号)来存储值,而float
只有 24 位(加上指数和符号)
这意味着一些较大的值不能无误地表示。如果您使用具有 53 位值的 double,则不会有问题。
简而言之,避免使用浮点数,除非你有充分的理由使用它。
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
在 java 中,