【问题标题】:Conversion without lossing precision from float to double and back into float在不损失精度的情况下从浮点数转换为双精度并返回浮点数
【发布时间】:2017-11-21 22:23:04
【问题描述】:

我想知道有没有办法将像这样的浮点数 0,00749052940542251 在不损失精度的情况下加倍并转换回相同的浮点数?

【问题讨论】:

    标签: c# floating-point type-conversion double precision


    【解决方案1】:

    从 float 转换为 double 不会损失精度,因为 double 是一种比 float 精度更高的类型。

    但是,您的示例数字对于浮点类型来说太精确了 - 将该数字存储在浮点数中总是会导致精度损失,因为您的数字有 15 个有效数字,而浮点数只能存储 6 到 9 个有效数字。 double 可以存储 15 到 16。为了更好地理解为什么会这样,我在下面的维基百科中包含了一些文章。您可能想了解更多关于浮点数的信息,C# 的 float 和 double 类型都是。

    延伸阅读:
    Wikipedia - Single (C# float)
    Wikipedia - Double
    Wikipedia - Floating-point Arithemtic

    【讨论】:

    • "一个浮点数只能存储 6 到 9 位有效数字。"反例,浮点数可以精确存储 2^-24。这有 17 个有效数字:0.000000059604644775390625。浮点数可以存储范围内的所有 6 位有效数字。 10+/-38。它还可以存储许多超过 6 位的选择值。
    • @Chux - 这并不是浮点数的真正工作方式。我在总结一般情况。确实,精确的十进制表示可能有超过六个有效数字,而且非规范表示的行为也不同。这些都不是与这个问题特别相关。对于不是在非规范范围内可表示的特定数字的数字,6 到 9 位精度的十进制数字是一个很好的、易于理解的近似值。因为它是二进制浮点格式,所以不能很好地映射到十进制概念。
    【解决方案2】:

    “0,00749052940542251”不是浮点数 - 完全正确。

    一个 32 位浮点数可以编码大约 232 个不同的值正好。 0,00749052940542251 不是其中之一。相反,当代码将 0,00749052940542251 分配给浮点数时,浮点数会存储附近的值:

    0,007490529 213...  The closest float
    0,007490529 40542251
    0,007490529 678...  The next closest float
    

    由于 double 的精度和范围超过了 float,所以任何 float --> double --> float 都可以精确地往返。


    0,00749052940542251 也不是大约 264 个可编码为双精度值的不同值之一。同样,使用附近的值。更接近,但不一样。

    0,007490529 4054225 099..
    0,007490529 4054225 1
    0,007490529 4054225 107..
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2015-06-12
      • 1970-01-01
      • 2014-05-29
      • 2018-04-26
      相关资源
      最近更新 更多