java - 为什么当我将一个 int 分配给一个 float 时,它不是相同的值?

标签 java

当我从 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

谢谢!

最佳答案

floatint 具有相同的位数——32 位。但它允许更大范围的值,远大于 int 值的范围。但是,精度固定为 24 位(23 个“尾数”位,加上 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 值,即大约 2亿。

关于java - 为什么当我将一个 int 分配给一个 float 时,它不是相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23897829/

相关文章:

java - JAVA中使用MD5比较文件内容

java - 带唯一文件名的 Spring Boot YAML 配置

java - Android/Java : Show GUI on "off-screen" (Always-On Display. ..)

java - Umano 的 SlidingUpPanelLayout : Got a weird error in XML when I used it

java - 初学者 : Adding a Teleport Room to World Of Zuul

java - 如何在Spark Streaming中使用redis?

java - 在 PostgreSQL 和 JPA/Hibernate 中使用 Point 类型

java - 在Java中嵌套类并在静态main中引用它们

java - 跟进: Create an an array of objects from classname

java - 为什么泛型不能应用于相同的签名?