转换时不会损失精度,从float到double再返回float

时间:2017-11-21 22:23:04

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

我想知道是否有一种方法可以将像这样的0,00749052940542251转换为双倍而不会损失精度并转换回相同的浮点数?

2 个答案:

答案 0 :(得分:3)

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

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

进一步阅读:
Wikipedia - Single (C# float)
Wikipedia - Double
Wikipedia - Floating-point Arithemtic

答案 1 :(得分:1)

“0,00749052940542251”不是浮动 - 确切地说。

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

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

由于double的精度和范围超过浮点数,任何浮点数 - >双 - >漂浮可以完全往返。

0,00749052940542251不是约2 64 不同值中的一个,也可以编码为double。同样,使用附近的值。更近,但不一样。

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