如何在java中将float转换为double?

这个问题在这里已经有了答案:

  • 为什么从float转换为double会更改值? 8个答案

  • 出现这种问题的原因是因为计算机只能用于离散数学,因为微处理器只能表示内部完整数字,而不能表示小数。 因为我们不仅可以使用这些数字,而且可以使用小数来规避这种情况,但几十年前,非常聪明的工程师已经发明了浮点表示法,标准化为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.toStringdouble ):

    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 ,这样你就不会真正丢失任何精确的转换。

    当然,并非所有的数字都可以用floatdouble精确表示,这就是为什么你首先看到十进制表示中看似随机的额外数字的原因。 请参阅“每位计算机科学家应了解的浮点算术知识”。

    链接地址: http://www.djcxy.com/p/84105.html

    上一篇: How float is converted to double in java?

    下一篇: cli: how to place CSS in pods