当我从int赋值给float时,我认为float允许更精确,所以不会丢失或改变赋值,但我所看到的是完全不同的东西。这里发生了什么?
for(int i = 63000000; i < 63005515; i++) {
int a = i;
float f = 0;
f=a;
System.out.print(java.text.NumberFormat.getInstance().format(a) + " : " );
System.out.println(java.text.NumberFormat.getInstance().format(f));
}
一些输出:
...
63,005,504:63,005,504
63,005,505:63,005,504
63,005,506:63,005,504
63,005,507:63,005,508
63,005,508:63,005,508
谢谢!
答案 0 :(得分:14)
float
具有与int
- 32位相同的位数。但它允许更大范围的值,远远大于int
值的范围。但是,精度固定为24位(23&#34;尾数&#34;位,加上1隐含1
位)。在大约63,000,000的值处,精度大于1
。您可以使用Math.ulp
方法验证这一点,该方法给出了2个连续值之间的差异。
代码
System.out.println(Math.ulp(63000000.0f));
打印
4.0
您可以使用double
值来获得更高(但仍然有限)的精度:
System.out.println(Math.ulp(63000000.0));
打印
7.450580596923828E-9
但是,您可以在这里使用int
,因为您的值大约为6300万,仍远低于最大可能的int
值,大约为20亿。
答案 1 :(得分:2)
java中的float是一个IEEE 754浮点数表示,即使它可用于表示从±1.40129846432481707e-45到±3.40282346638528860e + 38的值,它只有6或7个有效十进制数字。
一个简单的解决方案是使用一个至少包含14位有效数字的double,并且可以毫无问题地覆盖int的所有值。
但是,如果它准确无误,那么你要远离原生浮点表示,去找BigInteger和BigDecimal等类。
答案 2 :(得分:1)
不,它们不一定是相同的值。 int和float都是32位,但在浮点数中,其中一些位用于数字的浮点部分,因此可以在浮点数中表示的整数较少,而在int中表示的数字较少。根据您的应用程序使用这些数字执行的操作,您可能不关心这些差异,或者您可能希望使用类似BigDecimal的内容。
答案 3 :(得分:1)
花车不允许更精确,花车允许更宽范围的数字。
对于范围(大约)-2 * 10 ^ 9到2 * 10 ^ 9的整数,我们有2 ^ 32个可能的值。浮点数也是32位,因此可能值的数量与整数最多相同。
在这32位中,其中一些是为 mantisa 保留的,其余的是 exponent 。然后计算浮点数表示的结果数(为简单起见,我将使用10-base)作为mantisa * 10^exponent
。
显然,最大精度受分配给 mantisa 的位数限制。因此,您可以将整数完全表示为整数,但它们不适合mantisa,因此最低有效位会被丢弃,就像您的情况一样。
答案 4 :(得分:0)
Float
具有更大的值范围但精度更低。
Int
具有较低的值范围,但精度较高。
Int特定于1,而Float特定于4。
因此,如果您正在处理数万亿但不关心+/- 4,那么请使用float。但如果您需要最后一位数字,则需要使用int。