如何在java中将float转换为double?
这个问题在这里已经有了答案:
出现这种问题的原因是因为计算机只能用于离散数学,因为微处理器只能表示内部完整数字,而不能表示小数。 因为我们不仅可以使用这些数字,而且可以使用小数来规避这种情况,但几十年前,非常聪明的工程师已经发明了浮点表示法,标准化为IEEE754。
IEEE754标准定义了如何在内存中解释浮动和双精度。 基本上,与代表精确值的int不同,浮点数和双精度计算来自:
所以这里的问题是,当你将1.2
存储为double时,实际上存储了一个二进制近似值:
00111111100110011001100110011010
它给你1.2的最接近的表示,可以使用二进制分数进行存储,但不完全是这个分数。 在十进制小数中, 12*10^-1
给出了一个确切的值,但是作为二进制小数,它不能给出确切的值。
(参见http://www.h-schmidt.net/FloatConverter/IEEE754.html,因为我懒得自己做)
当我在一个双变量'y'中存储1.2时,它变成了1.200000025443的东西
实际上在浮点数和y
的双精度版本中,实际值都是1.2000000476837158
,但由于浮点数的尾数较小,所表示的值在近似值之前被截断,使您相信这是一个确切值,而在内存中不是。
这是格式化的问题。
看看在Float.toString
文档( Float.toString
是所谓产生您将看到的十进制表示float
S和Double.toString
为double
):
m或a的小数部分必须打印多少位数? 必须至少有一位数字来表示小数部分,并且除此之外还需要多达数量的位数,以便将参数值与类型为float
相邻值进行唯一区分。 也就是说,假设x是由这种方法产生的十进制表示的精确数学值,用于有限非零参数f。 那么f必须是最接近x的浮动值; 或者,如果两个float
值等于x,则f必须是其中的一个,并且f的有效数的最低有效位必须为0。
(强调我的)
Double.toString
的情况相同。 但是 ,您需要更多数字来“将double
参数值与double
类型的相邻值进行唯一区分”,而不是使用float
(回想一下, double
是64位,而float
是32),这就是为什么您会看到double
的额外数字而不是float
。
请注意,任何可以表示为float
也可以由代表double
,这样你就不会真正丢失任何精确的转换。
当然,并非所有的数字都可以用float
或double
精确表示,这就是为什么你首先看到十进制表示中看似随机的额外数字的原因。 请参阅“每位计算机科学家应了解的浮点算术知识”。