使用这个片段:
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
。
这个铸造转换数学是如何工作的?
发布于 2022-09-27 09:15:27
对于浮点数学来说,这是完全正常的。int
和float
都是32位值.float
只有大约7位的精确性,因为它使用了一些比例尺。当您得到大值时,“相邻”float
值(即从一个精确地表示值到下一个值向上)相隔超过1,因此这两个相邻值之间的任何整数都不能精确地表示为float
。
另一种看待这个问题的方法是针孔原理的一个版本
float
和int
都有2^32种可能的位模式。int
到一个float
值都有一个有效的映射int
,因此有2^32个可能的整数值。float
还包含值1.5 (以及许多其他非整数,但我们只需要其中一个来证明这一点)。int
值必须映射到同一个float
,这意味着映射不可能在每种情况下都是可逆的。请注意,如果使用double
,就可以将每个int
转换为double
,然后再转换为int
,然后得到原始值。但是,使用double
和long
(而不是int
)会遇到相同的问题,原因相同,但使用64位而不是32位。
发布于 2022-09-27 09:21:40
这个铸造转换数学是如何工作的?
将int
转换为float
的工作方式与任何浮点操作的工作方式相同:做数学运算(在本例中为零--只需将int转换为整数),然后将其转换为“最近可表示的浮点数”,该浮点数比任何其他浮点数更接近计算结果。
为什么是“有损”?看另一个答案。
浮动的可表示性的数学基础是什么?维基百科关于IEEE754浮点表示的页面解释了这一点。
https://stackoverflow.com/questions/73871349
复制