当我从一个int分配到一个浮点数时,我认为浮点数允许更高的精度,所以不会丢失或改变分配的值,但我所看到的是完全不同的东西.这里发生了什么?
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));
}
Run Code Online (Sandbox Code Playgroud)
一些输出:
...
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
谢谢!
rge*_*man 14
A float具有与int-32位相同的位数.但它允许更大范围的值,远远大于int值的范围.但是,精度固定为24位(23"尾数"位,加上1个隐含1位).在大约63,000,000的值,精度大于1.您可以使用Math.ulp方法验证这一点,该方法给出了2个连续值之间的差异.
代码
System.out.println(Math.ulp(63000000.0f));
Run Code Online (Sandbox Code Playgroud)
版画
4.0
Run Code Online (Sandbox Code Playgroud)
您可以将double值用于更大(但仍然有限)的精度:
System.out.println(Math.ulp(63000000.0));
Run Code Online (Sandbox Code Playgroud)
版画
7.450580596923828E-9
Run Code Online (Sandbox Code Playgroud)
但是,您可以在int这里使用s,因为您的值大约为6300万,仍远低于最大可能int值,即大约20亿.
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |