sta*_*tan 25 java floating-point precision double
我有一个我正在修改的考试题目,问题是4分.
"在java中,我们可以将int分配给double或float".这会丢失信息吗?为什么?
我已经说过,因为int通常具有固定的长度或大小 - 存储数据的精度是有限的,其中以浮点存储信息可能是无限的,基本上我们丢失信息因为这个
现在我有点粗略地说我是否在这里击中了正确的区域.我非常肯定它会失去精确度,但我无法完全理解为什么.我能得到一些帮助吗?
dan*_*n04 27
没有必要知道浮点数的内部布局.所有你需要的是鸽巢原理和知识int
,并float
具有相同的尺寸.
int
是一个32位类型,每个位模式代表一个不同的整数,因此有2 ^ 32个int
值.float
是32位类型,因此它最多有2 ^ 32个不同的值.float
s表示非整数,因此表示整数的值少于 2 ^ 32 float
.int
值将转换为相同float
(=精度损失).类似的推理可以long
和和一起使用double
.
pol*_*nts 19
以下是JLS对此事的评论(在非技术性讨论中).
以下19种基本类型的特定转换称为扩展基元转换:
int
到long
,float
或double
- (其余省略)
的转换
int
或一个long
值float
,或者一个的long
值double
,可能导致精度的损失 -即,结果可能会丢失一些值的至少显著位.在这种情况下,使用IEEE 754舍入到最接近模式,得到的浮点值将是整数值的正确舍入版本.尽管可能发生精度损失,但原始类型之间的转换不会导致运行时异常.
以下是失去精度的扩展转换示例:
Run Code Online (Sandbox Code Playgroud)class Test { public static void main(String[] args) { int big = 1234567890; float approx = big; System.out.println(big - (int)approx); } }
打印:
Run Code Online (Sandbox Code Playgroud)-46
因此表明在从类型
int
到类型的转换过程中信息丢失,float
因为类型的值float
不精确到九位有效数字.
Mic*_*rdt 14
不,float
并且double
也是固定长度 - 他们只是使用不同的位.阅读有关它们在Floating-Poing指南中的确切工作原理的更多信息.
基本上,在分配int
a 时不会失去精度double
,因为它double
具有52位精度,足以容纳所有int
值.但是float
只有23位的精度,因此它不能精确地表示int
大于约2 ^ 23的所有值.
小智 5
你的直觉是正确的,你可能会在转换时松的精度int
来float
。但是,它不像大多数其他答案中所提供的那样简单。
在Java中,FLOAT使用23位尾数,因此大于2 ^ 23的整数的最低有效位将被截断。(摘自本页上的帖子)
不对。
示例:这是一个大于2 ^ 23的整数,该整数将转换为没有损失的浮点数:
int i = 33_554_430 * 64; // is greater than 2^23 (and also greater than 2^24); i = 2_147_483_520
float f = i;
System.out.println("result: " + (i - (int) f)); // Prints: result: 0
System.out.println("with i:" + i + ", f:" + f);//Prints: with i:2_147_483_520, f:2.14748352E9
Run Code Online (Sandbox Code Playgroud)
因此,大于2 ^ 23的整数的最低有效位将被截断是不正确的。
我发现的最佳解释是:
Java中的浮点数是32位,并表示为:
符号*尾数* 2 ^指数
符号*(0至33_554_431)* 2 ^(-125至+127)
来源:http:// /www.ibm.com/developerworks/java/library/j-math2/index.html
为什么这是一个问题?
留下的印象是,您可以通过查看 int的大小来确定从int到float的精度是否有所损失。
我特别看过Java考试问题,询问一个大int是否可以毫无损失地转换为浮点数。
另外,有时人们倾向于认为从int到float的精度会下降:
当int大于:1_234_567_890
如果int大于:2指数23(等于:8_388_608 ),则不正确 (请参见上面的反示例)
。 ) 不成立
时的int大于:2指数24(等于:16_777_216) 不是真正的
结论
从足够大的整数到浮点数的转换可能会失去精度。
仅通过查看 int的大小就无法确定是否会有损失(即,不尝试更深入地研究实际的float表示形式)。