首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java int强制转换到浮点强制转换到int并不等于原始int。

Java int强制转换到浮点强制转换到int并不等于原始int。
EN

Stack Overflow用户
提问于 2022-09-27 17:05:00
回答 2查看 128关注 0票数 1

使用这个片段:

代码语言:javascript
复制
    public static void main(String[] args){
        int i = XXX;
        System.out.println( (int) ( (float) i ) );
    }

如果是int i = 1234;,那么输出是1234

如果是int i = Integer.MAX_VALUE;,则输出等于Integer.MAX_VALUE

但是,如果是int i = 1234567990;,则输出是1234567936,它不等于i

如果是int i = 1235567990;,那么输出就是1235568000,这也不等于i

这个铸造转换数学是如何工作的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-27 17:15:27

对于浮点数学来说,这是完全正常的。intfloat都是32位值.float只有大约7位的精确性,因为它使用了一些比例尺。当您得到大值时,“相邻”float值(即从一个精确地表示值到下一个值向上)相隔超过1,因此这两个相邻值之间的任何整数都不能精确地表示为float

另一种看待这个问题的方法是针孔原理的一个版本

  • floatint都有2^32种可能的位模式。
  • 从每个int到一个float值都有一个有效的映射
  • 每个位模式都是一个有效的int,因此有2^32个可能的整数值。
  • float还包含值1.5 (以及许多其他非整数,但我们只需要其中一个来证明这一点)。
  • 因此,至少两个int值必须映射到同一个float,这意味着映射不可能在每种情况下都是可逆的。

请注意,如果使用double,就可以将每个int转换为double,然后再转换为int,然后得到原始值。但是,使用doublelong (而不是int)会遇到相同的问题,原因相同,但使用64位而不是32位。

票数 12
EN

Stack Overflow用户

发布于 2022-09-27 17:21:40

这个铸造转换数学是如何工作的?

int转换为float的工作方式与任何浮点操作的工作方式相同:做数学运算(在本例中为零--只需将int转换为整数),然后将其转换为“最近可表示的浮点数”,该浮点数比任何其他浮点数更接近计算结果。

为什么是“有损”?看另一个答案。

浮动的可表示性的数学基础是什么?维基百科关于IEEE754浮点表示的页面解释了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73871349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档