C# 在不损失精度的情况下,从浮点转换为双精度,再转换回浮点

C# 在不损失精度的情况下,从浮点转换为双精度,再转换回浮点,c#,floating-point,type-conversion,double,precision,C#,Floating Point,Type Conversion,Double,Precision,我想知道有没有一种方法可以在不损失精度的情况下将像000749052940542251这样的浮点转换为double并转换回相同的浮点?从浮点转换为double并不涉及精度损失,因为double是比float更高精度的类型 但是,您的示例数字对于浮点类型来说过于精确-将该数字存储在浮点中总是会导致精度损失,因为您的数字有15个有效数字,而浮点只能存储6到9个有效数字。双人床可以储存15到16个。为了更好地理解这一点,我在下面加入了一些维基百科的文章。您可能想阅读更多关于浮点数的内容,C#的浮点型和

我想知道有没有一种方法可以在不损失精度的情况下将像000749052940542251这样的浮点转换为double并转换回相同的浮点?

从浮点转换为double并不涉及精度损失,因为double是比float更高精度的类型
但是,您的示例数字对于浮点类型来说过于精确-将该数字存储在浮点中总是会导致精度损失,因为您的数字有15个有效数字,而浮点只能存储6到9个有效数字。双人床可以储存15到16个。为了更好地理解这一点,我在下面加入了一些维基百科的文章。您可能想阅读更多关于浮点数的内容,C#的浮点型和双精度型都是浮点数

进一步阅读:


“000749052940542251”不是浮点数-确切地说

32位浮点可以精确地编码232个不同的值。000749052940542251不是其中之一。相反,当代码将000749052940542251分配给浮点时,浮点存储附近的值:

0,007490529 213...  The closest float
0,007490529 40542251
0,007490529 678...  The next closest float
由于double的精度和范围超过了float,因此任何float-->double-->float都可以精确往返



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

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

“浮点数只能存储6到9个有效数字。”反例,浮点数可以精确存储2^-24。它有17个有效数字:0.000000059604644775390625。浮点数可以存储范围内的所有6位有效数字。10+/-38. 它还可以存储超过6位的许多select值。@Chux-浮点数字实际上不是这样工作的。我在总结一般情况。确实,精确的十进制表示可能有六个以上的有效数字,而且非规范表示的行为也不同。这两个问题都与这个问题无关。对于非规范范围内可表示的特定数字以外的数字,精度为6到9位的十进制数字是一个良好的、可理解的近似值。因为它是二进制浮点格式,所以不能很好地映射到十进制概念。