【发布时间】:2017-11-21 22:23:04
【问题描述】:
我想知道有没有办法将像这样的浮点数 0,00749052940542251 在不损失精度的情况下加倍并转换回相同的浮点数?
【问题讨论】:
标签: c# floating-point type-conversion double precision
我想知道有没有办法将像这样的浮点数 0,00749052940542251 在不损失精度的情况下加倍并转换回相同的浮点数?
【问题讨论】:
标签: c# floating-point type-conversion double precision
从 float 转换为 double 不会损失精度,因为 double 是一种比 float 精度更高的类型。
但是,您的示例数字对于浮点类型来说太精确了 - 将该数字存储在浮点数中总是会导致精度损失,因为您的数字有 15 个有效数字,而浮点数只能存储 6 到 9 个有效数字。 double 可以存储 15 到 16。为了更好地理解为什么会这样,我在下面的维基百科中包含了一些文章。您可能想了解更多关于浮点数的信息,C# 的 float 和 double 类型都是。
延伸阅读:
Wikipedia - Single (C# float)
Wikipedia - Double
Wikipedia - Floating-point Arithemtic
【讨论】:
“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..
【讨论】: